2017-04-21 2 views
0

Für Klauseln wie MATCH (a:Address)-[:BelongTo]->(w1:Wallet), (a)-[r0:BelongTo]->(w2:Wallet) WHERE ID(w1)>ID(w2) WITH w1, w2..., ist es möglich, sicherzustellen, dass ex. w1 ist immer ein fester Knoten? Wenn ja, ist es möglich, sich für den Knoten zu entscheiden, indem Sie den Knoten mit ex wählen. der Mindestwert für eine bestimmte Eigenschaft über alle Knoten, die auch w1 sein könnten?Neo4j: Wie man einen der Knoten in der Übereinstimmungsklausel repariert?

Konkreter, zum Beispiel gehören eine Adresse a zu Brieftasche a, b, c mit einem> b> c in Bezug auf die ID. Dann normalerweise diese Reihen Ergebnis wird zurückgegeben:

w1 w2 
-------- 
a b 
b c 
a c 

Ich möchte nur diese beiden Reihen Ergebnis zurückgegeben werden:

w1 w2 
-------- 
a b 
a c 

Anmerkung: Ich die Abfrage versuchen wollen jedes Paar von Geldbörsen zu erhalten, beide Adressen gehören zu. Alle Adressen, die zu zwei oder mehr Briefen gehören, sollten im Gegenzug enthalten sein, wenn eine zurückgegeben wird.

Wenn zum Beispiel zwei Adressen zu drei verschiedenen Brieftaschen gehören, was würde die von Ihnen gepostete Abfrage tun? Konkreter, wenn Adressen a1 und a2 zu b1 gehören, c1, d1 und b2, c2, d2 jeweils (mit b1> c1> d1> B2> C2> d2 hinsichtlich id)

Ich will es zurück:

a w1 w2 
----------- 
a1 b1 c1 
a1 b1 d1 
a2 b2 c2 
a2 b2 d2 

Ist es möglich?

+0

Nicht klar, was Ihre aktuelle Abfrage versucht, und warum. Wird versucht, jedes Paar Brieftaschen für eine einzelne Adresse oder für alle Adressen zu erhalten? – cybersam

+0

Über alle Adressen. Ich will es versuchen, jedes Paar Brieftaschen zu einer Adresse zu bekommen. Alle Adressen, die zu zwei oder mehr Briefen gehören, sollten im Gegenzug enthalten sein, wenn eine zurückgegeben wird. Ich werde die Frage aktualisieren. – Aqqqq

Antwort

0

Ja, Sie können dies tun, indem Sie (für jede a: Adresse) die Brieftasche mit der Mindest-ID suchen. Nachdem Sie zu diesem passen: Brieftasche, können Sie mit allen anderen übereinstimmen: Brieftaschen.

MATCH (a:Address)-[:BelongTo]->(w1:Wallet) 
WITH a, min(id(w1)) as minId 
// since we have the minId, we can do a fast lookup of the node 
MATCH (minW:Wallet) 
WHERE id(minW) = minId 
// now get all the others 
MATCH (a)-[:BelongTo]->(w2:Wallet) 
WHERE minW <> w2 
... 

Wenn Sie kümmern sich nicht, wie der feste Knoten genommen wird, und wenn es nur wichtig für die Dauer der Abfrage, kann es einfacher sein, die alle zu sammeln: Wallet Knoten, in der der erste Knoten nehmen Sammlung und dann den Rest in Zeilen UNWIND und die Abfrage fortsetzen:

MATCH (a:Address)-[:BelongTo]->(w:Wallet) 
WITH a, collect(w) as wallets 
WITH a, head(wallets) as w1, wallets 
UNWIND tail(wallets) as w2 
... 
Verwandte Themen