2017-02-11 3 views
0

Ich beginne mit Neo4j und wundere mich über die Knoten zu einem anderen Knoten an einer Länge von höchstens k Kanten (Freund eines Freundes eines Freundes ... bis k-mal) zu finden. Ich werde mit dem Beispiel aus dem Tutorial in Neo4j selbst illustrieren (Ich habe Grafik-Erstellung Befehle sind am unteren Rand).Cypher verhindern das Aufzählen aller Pfade

Diese Abfrage würde Knoten zurückgeben, die mit Emil verbunden sind, und Knoten, die mit diesen Knoten verbunden sind. Mein Problem ist, dass es scheint, dass dies JEDEN Pfad der Länge 1-2 von Emil auflistet, obwohl es mir egal ist, alle Pfade aufzählen. Aus der Abfrage geht klar hervor, dass mir nur die Knoten wichtig sind, die in dieser Entfernung mit Emil verbunden sind, und das Aufzählen aller möglichen Pfade ist ein schlechter Weg, diese Abfrage zu realisieren. Dies ist ein Problem in großen, dichten Graphen, da die Komplexität überwältigend wird.

Entfernen Sie DISTINCT und es wird 8 Datensätze geben, das ist die Anzahl der eindeutigen 1-2 Länge Pfade von Emil. Basierend auf meinen Tests in größeren Diagrammen scheint DISTINCT ein Post-Processing-Schritt zu sein, der die Laufzeit der Abfrage nicht beeinflusst, obwohl die redundante Ausgabe eliminiert wird. Ist das korrekt?

Meine Hauptfrage, gibt es eine Möglichkeit, eine Cypher-Abfrage für dieses Problem zu bilden, so dass ich nicht alle eindeutigen Pfade durchquere und die Komplexität reduziert werden kann? Bitte lassen Sie mich wissen, wenn ich irgendwo ein Missverständnis habe.

---- Befehle die Grafik -----

CREATE (ee:Person { name: "Emil", from: "Sweden", klout: 99 }) 
CREATE (js:Person { name: "Johan", from: "Sweden", learn: "surfing" }), 
(ir:Person { name: "Ian", from: "England", title: "author" }), 
(rvb:Person { name: "Rik", from: "Belgium", pet: "Orval" }), 
(ally:Person { name: "Allison", from: "California", hobby: "surfing" }), 
(ee)-[:KNOWS {since: 2001}]->(js),(ee)-[:KNOWS {rating: 5}]->(ir), 
(js)-[:KNOWS]->(ir),(js)-[:KNOWS]->(rvb), 
(ir)-[:KNOWS]->(js),(ir)-[:KNOWS]->(ally), 
(rvb)-[:KNOWS]->(ally) 

Antwort

0

Max De Marzi bei Neo schrieb eine große blog post über diese Art von Abfragen zu erstellen, so variabler Länge Spiele, in denen das einzige Interesse ist für unterschiedliche Knoten, nicht Pfade, wird vom Abfrageplaner in einer zukünftigen Version erkannt und optimiert, wahrscheinlich 3.2.

In der Zwischenzeit hat APOC Procedures eine Lösung in ihrem apoc.path.expandConfig() Aufruf, wenn Sie 'NODE_GLOBAL' als Eindeutigkeitsparameter angeben.

Dadurch wird sichergestellt, dass während der Pfaderweiterung gefundene Knoten nur einmal besucht werden. Daher sollten Sie nicht mehrere Pfade zum selben Knoten sehen.

match (e {name:"Emil"}) 
call apoc.path.expandConfig(e, {maxLevel:2, uniqueness:'NODE_GLOBAL'}) yield path 
WITH e, last(nodes(path)) as subgraph 
where e <> subgraph 
return e, subgraph; 
+0

Danke! Beide sind genau das, wonach ich suche. – steve

Verwandte Themen