2017-07-02 3 views
2

Ich habe eine Cypher Abfrage, die einen TagSynonym Knoten zwischen zwei Tag Knoten zurückgibt:Neo4j Cypher rekursive Abfrage

MATCH (t:Tag)<-[:FOR]-(ts:TagSynonym)-[:HAS]->(s:Tag) 
WHERE t.id = {tagId} AND s.id = {synonymId} 
RETURN ts 

Zusätzlich kann der s:Tag Knoten selbst kann seine eigene TagSynonym Knoten wie haben:

(s)<-[:FOR]-(ts:TagSynonym)-[:HAS]->(ss:Tag) 

und ss kann seine eigene TagSynonym und so weiter und so weiter haben.

Die Tiefe dieser Struktur kann ziemlich groß sein.

Bitte helfen Sie mir, diese Abfrage zu erweitern, um alle TagSynonym gegründet auf t:Tag und alle von ihr Synonym Nachfolger zurückzukehren (Tags für s:Tag und tiefer bis zum Ende dieser rekursive Struktur.)

Antwort

3

so etwas wie dies funktioniert sieht aus wie es in die richtige Richtung geht?

Verwenden Sie grundsätzlich apoc.path.expandConfig, um bei s zu starten und beginnen, neue TagSynonym und Tag Knoten zu greifen.

MATCH (t:Tag)<-[:FOR]-(ts:TagSynonym)-[:HAS]->(s:Tag) 
WHERE t.id = {tagId} AND s.id = {synonymId} 
WITH t, ts, s 
CALL apoc.path.expandConfig(s 
{ 
    uniqueness:"NODE_GLOBAL", 
    labelFilter:"TagSynonym|Tag", 
    relationshipFilter: '<FOR|HAS>' 
}) YIELD path 
RETURN t, ts, s, path 

Optional Sie etwas entlang der Linien dieser Abfrage ...

für Ihre Antwort
MATCH (t:Tag)<-[:FOR]-(ts:TagSynonym)-[:HAS]->(s:Tag) 
WHERE t.id = {tagId} AND s.id = {synonymId} 
WITH t,ts,s 
OPTIONAL MATCH p=(s)-[:FOR|HAS*]-(end:Tag) 
WHERE NOT (end)<-[:FOR]-() 
RETURN p 
+0

Dank konnte erreichen etwas ähnliches ohne die APOC-Bibliothek betrachten. Ich entschuldige mich, aber ist es möglich, ohne apoc zu implementieren? Ich habe versucht, vorher apoc zu installieren, aber scheiterte (vor allem für meine Tests basierend auf dem eingebetteten Neo4j) und verwende eine reine Cypher-Abfrage bei meiner Anwendung. – alexanoid

+2

Ich habe eine Nicht-APOC-Abfrage hinzugefügt, die für Sie funktionieren könnte. Ich bin mir nicht sicher, wie es sich mit Ihren Daten verhalten wird. Achte auch auf das nackte '*' in der Pfad-Erweiterung. Es könnte schnell außer Kontrolle geraten, je nachdem, wie komplex Ihre "Tag" - und "TagSynonym" -Knoten sind. –

+0

Danke, es funktioniert! – alexanoid