2016-03-18 14 views
0

Ein Benutzer übergibt mir ein Array von UUID, die auf Knoten in meiner Datenbank verweisen. Ich möchte ihren USER-Knoten mit jedem dieser anderen Knoten in Verbindung bringen. Die Herausforderung ist, ich möchte die Reihenfolge wissen, in der die UUIDs mir gegeben wurden.Inkrementieren eines Werts in Neo4j-Abfrage

Wenn also die UUIDs sind: [AAA, CCC, BBB], ich will wie etwas auszuführen:

(user)-[:REL {order: 1}]->(:THING {name:"AAA"}) 
(user)-[:REL {order: 2}]->(:THING {name:"CCC"}) 
(user)-[:REL {order: 3}]->(:THING {name:"BBB"}) 

Natürlich, ich will nicht, dass es in mehreren Anweisungen tun. Ich möchte diese Liste als Parameter übergeben.

MATCH(u:USER {id:{id}}) 
MATCH(t:THING) where t.name in {that_list} 
CREATE (u)-[:REL {order: ???}]->(t) 

Beachten Sie die ???. Das ist der Kernpunkt.

Wie kann dies erreicht werden? Ich habe es Tests mit einer Schleife bestanden, aber ich denke, ich sollte in der Lage sein, dies zu tun.

+0

Ich kenne Ihre Anwendungsfälle nicht, aber haben Sie darüber nachgedacht, die 'THING'-Knoten in der richtigen Reihenfolge zu verketten, so dass Sie nicht die' order'-Eigenschaften haben müssen? So: '(Benutzer) - [: REL] -> (: THING {Name:" AAA "}) - [: REL] -> (: THING {Name:" BBB "}) - [: REL] -> (: DING {Name: "CCC"}) '? – cybersam

+0

@cybersam das ist sehr schlau. Ich bin mir nicht sicher, ob ich das in meinem Fall kann, aber es ist sehr graphisch. Ich mag das. –

Antwort

1

Dies könnte für Sie arbeitet:

MATCH(u:USER {id:{id}}) 
UNWIND {that_list} AS name 
MATCH(t:THING) WHERE t.name = name 
WITH u, COLLECT(t) AS things 
FOREACH(i IN RANGE(0, SIZE(things)-1) | 
    FOREACH(x IN [things[i]] | CREATE (u)-[:REL {order: i}]->(x))); 

Die UNWIND macht jedes Element in der Liste in einer separaten Datenreihe, in der gleichen Reihenfolge.

Die innere FOREACH "iteriert" nur über einen einzelnen Knoten. Dieser Trick wird verwendet, weil das Muster CREATE keinen Ausdruck für einen Knoten verwenden kann. Daher wäre diese logisch äquivalente Klausel nicht legal gewesen: FOREACH(i IN RANGE(0, SIZE(things)-1) | CREATE (u)-[:REL {order: i}]->(things[i])).

+0

Was macht der UNWIND? Kann ich diese Zeile nicht löschen und stattdessen die folgende WHERE-Klausel in 't.name IN {that_list}' ändern? –

+0

Sieht so aus, als ob der verschachtelte FOREACH bewirkt, dass n^2 Relationen erzeugt werden. –

+0

1. Die 'UNWIND' ist da, um die Reihenfolge in Ihrer Liste zu erzwingen, da neo4j Zeilen in der gleichen Reihenfolge erstellt. Die 'IN'-Syntax garantiert keine Bestellung. 2. Der innere 'FOREACH'" iteriert "nur über einen einzelnen Knoten, so dass die Abfrage nicht 'O (N^2)' ist. Dieser Trick wird verwendet, weil das Muster "CREATE" keine Knoten unterstützt, die von einem Ausdruck generiert wurden. – cybersam

Verwandte Themen