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.
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