2017-12-20 4 views
0

Ich möchte alle Schleifen finden, die mit einem bestimmten Knoten in einer Neo4j-Datenbank beginnen und enden. Ich habe versucht:Neo4j Cypher Finde Schleife von spezifischen Knoten

START n=node:Event(time=",timestamp,") 
MATCH p=(n)-[:LINKED_TO*1..5]->(n) 
WHERE NONE (n IN nodes(p) WHERE size(filter(x IN nodes(p) WHERE n = x))> 2) 
RETURN p, length(p) 

Dies ist das Beste, was ich Mashup von was im Web ist. Es gibt zwei Dinge, die ich nicht mag: 1. es stürzt ab 2. der Zählschwellenwert muss "> 2" sein, um den Start + Terminierungsknoten zu ermöglichen. Das bedeutet, dass Schleifen, die den gleichen Zwischenknoten zweimal besuchen, enthalten sind, was ich nicht wünschte.

Ich bin nicht interessiert am kürzesten Weg. Ich möchte alle Schleifen kennen, die zu meinem Startknoten zurückkehren.

Vielen Dank im Voraus!

Antwort

1

Diese Abfrage sollte alle Schleifen zurück, die auf dem angegebenen Knoten beginnen und enden und keine anderen wiederholten Knoten:

START n=node:Event(time=",timestamp,") 
MATCH p=(n)-[:LINKED_TO*1..5]->(n) 
UNWIND TAIL(NODES(p)) AS m 
WITH p, COUNT(DISTINCT m) AS cm 
WHERE LENGTH(p)-1 = cm 
RETURN p, LENGTH(p); 
+0

Das ist, was ich endlich gefunden habe, funktionierte für mich: –

0

Danke, cybersam! Das war hilfreich. Als getippt, gab es ein paar Fehler und warnte mich, dass "START" veraltet ist. Ich fand die folgenden Änderungen gearbeitet:

MATCH (n:Event{time:1458238060505007}) 
MATCH p=(n)-[:LINKED_TO*1..5]->(n) 
UNWIND TAIL(NODES(p)) AS m WITH p RETURN p 

Das einzige Problem dabei ist, dass es alle Pfade zu geben scheint, dass n durch den gewünschten Startknoten gehen. Ist das wahr? Wenn ja, gibt es eine Möglichkeit, dies zu korrigieren?

+0

Dies ist keine Antwort. Es sollte entweder ein Kommentar zu meiner Antwort sein oder in einer Bearbeitung Ihrer Frage enthalten sein oder eine neue Frage gestellt haben. Diese neue Cypher-Abfrage erfüllt übrigens nicht das, was Sie sagten, also haben Sie eine neue Frage? – cybersam

0

Das, was schließlich für mich arbeitete. Es ist sehr nah an dem, was Cybersam vorgeschlagen hat. Entschuldigungen dafür, dies "falsch" zu machen. Ich bin sicher, Cybersam wird mich wieder anschreien, aber das Hinzufügen von Code über Comment ist nicht sehr einfach zu lesen.

MATCH p=(n:Event{time:",timestamp,"})-[:LINKED_TO*1..5]->(n) 
UNWIND TAIL (NODES(p)) AS m 
WITH p,COUNT(DISTINCT m) AS cm 
WHERE LENGTH(p) = cm 
RETURN p 

Wie ich bereits erwähnt, war ein Knackpunkt die Verwendung von „START“, das veraltet und verursacht Fehler (zum Beispiel, wenn RNeo4j in R mit, die ich verwende). Die neue Methode scheint MATCH zu verwenden und den Startknoten im Pfadmuster anzugeben. Die andere verwirrende Sache für mich war die Verwendung von "LÄNGE (p) -1" anstelle von "LÄNGE (p)". Für einen Knoten, der sich mit einem anderen verbindet, hat der Pfad eine Länge von 2, nicht 3 und es gibt nur 2 eindeutige Knoten. Für meine Anwendung arbeitete "LÄNGE (p) = cm".

Schließlich, wenn Sie die Knoten in den Pfaden wollen, versuchen Sie nicht, "WITH m, ..." zu verwenden, weil dies die "COUNT (DISTINCT (m))" Berechnung aus irgendeinem Grund vermasselt, die ich nicht verstehen.

Verwandte Themen