2016-08-04 13 views
0

Ich habe Mühe, eine verkettete Liste mit einer Chiffre-Anweisung zu tun. Ich versuche für jedes k folgendes zu tun. Die verkettete Liste und die NEXT-Beziehung sollten durch k isoliert sein.Erstellen Sie eine verknüpfte Liste für alle Knoten, die durch Knoten mit Chiffre verbunden sind

match (elem:Event)<-[r:HAS_EVENT]-(k) 
WITH elem ORDER BY elem.id ASC 
WITH COLLECT(elem) AS elems 
FOREACH (n IN RANGE(0, LENGTH(elems)-2) | 
FOREACH (prec IN [elems[n]] | 
FOREACH (next IN [elems[n+1]] | 
MERGE (prec)-[:NEXT]->(next)))) 

Da es ist nicht möglich, eine MATCH-Anweisung in einer foreach-Anweisung zu tun, habe ich versucht, MATCH (a: Some_Label) mit einem als x UNWIND x als k und anderen Möglichkeiten, diesen Code auszuführen, indem für jeden k (ID-Sperre usw.). Ich habe immer eine lange Kette von: NEXT durch alle: Event-Knoten, was darauf hindeutet, dass die Match-Anweisung alle k Knoten berücksichtigt. Ich brauche Hilfe, wie man: Some_Label Knoten zusammenbringt und jedes von ihnen an den obigen Code weitergibt.

+0

Wie sehen Ihre Daten aus und wer ist 'k'? Können Sie Ihr Problem einfacher/detaillierter beschreiben? –

+0

k ist ein Support-Ticket in diesem Fall. Also ich möchte eine verknüpfte Liste für jedes Ticket erstellen. Jeder: Ereignisknoten hat einige andere Knoten, Status, Kategorisierung usw. angehängt. Jeder: Ticketknoten hat mehrere: Ereignisknoten. : Ticket und: Event-Etiketten sind durch ID indiziert Das Problem ist, dass ich die Tickets (MATCH (k: Ticket)), die ich in meinem Diagramm haben möchte und führen Sie den obigen Code für jedes k aus einer vorherigen Übereinstimmungserklärung. Idealerweise aus einer CSV-Anweisung LOAD, da neue Einträge auf diese Weise geladen werden, aber das ist nicht notwendig –

+0

MATCH (a: Ticket) mit einem --- ETWAS --- übereinstimmen (elem: Ereignis) <- [r: HAS_EVENT] - (k) MIT elem ORDER BY elem.ID ASC MIT COLLECT (elem) AS Elemente FOREACH (n IN RANGE (0, LENGTH (elems) -2) | FOREACH (vor IN [elems [n]] | FOREACH (nächstes IN [elems [n + 1 MERKEN (prec) - [: NEXT] -> (next)))) –

Antwort

0

Klingt, als gäbe es zwei Teile dazu. Zuerst passen Sie nur die k Knoten an, die in einer verknüpften Liste enthalten sein sollen (Filtern, Sortieren usw.).

Sobald Sie dies haben, ist alles, was Sie tun müssen, sie in eine Liste zu sammeln, und verwenden Sie apoc.coll.pairs([list]) YIELD value. Dies ändert die Liste in eine Liste von Paaren jedes sequentiellen Elements ([[first, second], [second, third] ...]). Sie müssen nur auf das letzte Paar achten, welches [last, null] ist.

An diesem Punkt müssen Sie nur ein FOREACH für jedes Element (Paar) machen und Ihre: NEXT-Beziehung zusammenführen.

EDIT

Sieht aus wie Sie die periodische Funktion verwenden die k Elemente iterieren Sie interessiert sind. Sie haben die COLLECT verwenden können() und Paare() Funktion verschachtelte foreach-Schleifen zu ersetzen.

+0

Im Anschluss sieht es so aus, als gäbe es Probleme mit der Verwendung von Paaren, die durch die pairs() - Prozedur in FOREACH generiert werden. [Dieser Fehler] (https://github.com/neo4j-contrib/neo4j-apoc-procedures/issues/94) fängt das Problem ein. – InverseFalcon

0

Ich nehme an, Sie möchten die NEXT Kette innerhalb einer Liste von Events erstellen. Und jede Event Liste kommt von einem MATCH zu einem bestimmten k Knoten.

Ich glaube, Sie könnten in der Lage sein, dies eine etwas andere WITH Klausel mit nur zu erreichen, indem der Bestellschritt:

MATCH (k:Ticket) // however you match here... 
WITH k 
// MATCH your k to Events 
MATCH (elem:Event)<-[r:HAS_EVENT]-(k) 
// include k in the WITH clause 
// now you have one result 'row' per k with the matching elem nodes 
WITH k, COLLECT(elem) AS elems 
// UNWIND, ORDER BY and collect() again to sort the list in each row 
UNWIND elems AS x 
WITH x ORDER BY x.id ASC 
WITH collect(x) AS ordered_elems_per_k 
// now the foreach should be applied for each k/list of elem pair 
FOREACH (n IN RANGE(0, LENGTH(ordered_elems_per_k)-2) | 
FOREACH (prec IN [ordered_elems_per_k[n]] | 
FOREACH (next IN [ordered_elems_per_k[n+1]] | 
MERGE (prec)-[:NEXT]->(next)))) 

Ich denke, es ist nicht möglich ORDER BY und collect() zu kombinieren. Dies würde Ihr Problem auf eine einfachere Weise lösen, aber etwas in dieser Richtung sollte funktionieren.

0

Ich habe es geschafft, dies zu lösen;

CALL apoc.periodic.iterate('Match (a:Ticket) return id(a) as id_p', 
'match (elem:Event)<-[r:HAS_EVENT]-(k) where id(k)={id_p} 
WITH elem ORDER BY elem.id ASC WITH COLLECT(elem) AS elems 
FOREACH (n IN RANGE(0, LENGTH(elems)-2) | 
FOREACH (prec IN [elems[n]] | 
FOREACH (next IN [elems[n+1]] | MERGE (prec)-[:NEXT]->(next))))', 
{batchSize:1000,parallel:true}) YIELD batches, total