2016-08-01 4 views
3

Ich habe einen GraphAware-Zeitbaum und einen räumlichen r-Baum eingerichtet, um auf eine große Menge von Knoten in meinem Graphen zu verweisen. Ich versuche, diese Aufzeichnungen nach Zeit und Raum zu durchsuchen.Wie kann ich die Ergebnisse mehrerer Prozeduraufrufe in Neo4j effizient filtern?

Individuell kann ich Ergebnisse aus diesen Abfragen in ca. 5 Sekunden sammeln:

WITH 
({start:1300542000000,end:1350543000000}) as tr 
CALL ga.timetree.events.range(tr) YIELD node as n 
RETURN count(n); 
> ~ 500000 results 

WITH 
({lon:120.0,lat:20.0}) as smin, ({lon:122.0,lat:21.0}) as smax 
CALL spatial.bbox('spatial_records', smin, smax) YIELD node as n 
RETURN count(n); 
> ~ 30000 results 

Wenn ich versuche, um diese Ergebnisse zu filtern die Leistung drastisch sinkt. Neo4j verbraucht bereits eine große Menge an Speicher in meinem System, so dass ich den Eindruck habe, dass der Speicherbedarf dieses Befehls zu sehr auf meinem System liegt und die Abfrage niemals beendet wird. (Ich verwende zum Neo4j-Shell diese Befehle ausführen)

WITH 
({start:1300542000000,end:1350543000000}) as tr, 
({lon:120.0,lat:20.0}) as smin, ({lon:122.0,lat:21.0}) as smax 

CALL ga.timetree.events.range(tr) YIELD node as n 
CALL spatial.bbox('spatial_records', smin, smax) YIELD node as m 

WITH COLLECT(n) as nn, COLLECT(m) as mm 

RETURN FILTER(x in nn WHERE X in mm); 

Ich frage mich, was der beste Weg, effizient die Ergebnisse dieser beiden Aussage Anrufe zu filtern ist. Ich habe versucht, die REDUCE-Klausel zu verwenden, konnte aber die Syntax nicht richtig herausfinden.

Als Nebenfrage, dies ist die häufigste Art von Abfrage, die ich an meine Datenbank ausgeben werde, ist dies eine gute Möglichkeit, Dinge zu tun (wie in der Zeit Baum und r Baum Referenzierung der gleichen Menge von Knoten)? Ich habe keine anderen Werkzeuge in neo4j gefunden, die die Indizierung von Raum und Zeit in einer einzigen Struktur unterstützen, also ist dies meine aktuelle Implementierung.

Antwort

2

Die erste Prozedur gibt Ihnen 500.000 Knoten zurück, und das Sammeln ist eine kostspielige Operation, also ja, das wäre sehr speicherintensiv.

Ich würde beginnen, was Sie weniger Knoten zurückgibt, und dann mit Chiffre und nicht eine Prozedur, also hier würde ich den Aufruf der Timtree-Prozedur durch einen Fern-Abfragefilter in Cypher ersetzen.

Sie Angenommen, haben eine indizierttimestamp Eigenschaft auf Ihrem Knoten:

CALL spatial.bbox('spatial_records', smin, smax) YIELD node as m 
WITH m 
WHERE m.timestamp > 1300542000000 and m.timestamp < 1350543000000 
RETURN m 

Ich würde nicht die timetree zu entfernen empfehlen (sonst würde ich < gefeuert werden - Witz). In einigen Zeitabfragen würde die Zeitleiste die Abfragen der Fernabfrage übertreffen, insbesondere wenn die Auflösung hoch ist (Millisekunden) und Sie sehr viele aufeinanderfolgende Zeitstempel haben.

Sonst scheinen Sie einen sehr guten Anwendungsfall zu haben, das wäre nett, wenn Sie mehr Details über den Neo4j-Schlaf oder privat senden könnten (christophe bei graphaware dot com), dies könnte Neo4j und GraphAware helfen, vielleicht mehr Zeug zu unterstützen über Prozeduren (wie das Übergeben einer Sammlung von Knoten und das Herausfiltern derjenigen, die nicht in dem Bereich oder einer glatten Kombination mit dem räumlichen Bereich liegen) in einer besseren Weise, solange es generisch genug ist.

In der Zwischenzeit können Sie, während Sie Open-Source-Produkte verwenden, problemlos ein Verfahren erstellen, das zwei Verfahren für Ihren spezifischen Anwendungsfall kombiniert.

+0

Danke für die Antwort. Ich habe definitiv darüber nachgedacht, in die Java-Welt zu gehen, um zu sehen, ob ich meinen eigenen Anruf machen könnte, der irgendwie auf der Grundlage der Ergebnisse, die parallel oder so ähnlich laufen, einen Hash-basierten, kostengünstigen Hash-Vorgang ausführt. Aber um ehrlich zu sein, bin ich etwas eingeschüchtert, da ich nicht viel Erfahrung mit Java habe. Ich schaute kurz in die apoc Bibliothek und fand einige interessante Anrufe. Ich bin mir nicht sicher, ob etwas darin hilfreich wäre. – spanishgum

Verwandte Themen