2016-04-07 9 views
1

Ich habe ein Diagramm. Einige Knoten spielen z. Ein Knoten Leena hätte auch einen weiteren Avatar AltLeena. Es kann viele Avatare von Leena geben.Wie Rollen von Knoten in Pfadausgabe auszuschließen

create (jacob {Desc:"Jacob",level:"start"}) 
     ,(leena{Desc:"Leena"}) 
     ,(bob{Desc:"Bob",level:"end"}) 
     ,(brad{Desc:"Brad"}) 
     ,(jacob)-[:LIKES]->(leena) 
     ,(leena)-[:LIKES]->(bob) 
     ,(leena)-[:LIKES]->(brad) 
     ,(jacob)-[:FRIENDS]->(brad) 
     ,(kyle{Desc:"Kyle",level:"start"}) 
     ,(rick{Desc:"Rick"}) 
     ,(kyle)-[:LIKES]->(leena) 
     ,(kyle)-[:LIKES]->(rick) 
     ,(rick)-[:LIKES]->(brad) 
     ,(rick_avatar{Desc:"AltRick",Type:"Avatar"}) 
     ,(leena_avatar{Desc:"AltLeena",Type:"Avatar"}) 
     ,(bill{Desc:"Bill"}) 
     ,(bill_avatar{Desc:"AltBill",Type:"Avatar"}) 
     ,(maya{Desc:"Maya",level:"end"}) 
     ,(kyle)-[:LIKES]->(rick_avatar) 
     ,(rick_avatar)-[:LIKES]->(brad) 
     ,(jacob)-[:LIKES]->(leena_avatar) 
     ,(leena_avatar)-[:LIKES]->(brad) 
     ,(brad)-[:LIKES]->(bill) 
     ,(brad)-[:LIKES]->(bill_avatar) 
     ,(bill)-[:LIKES]->(maya) 
     ,(bill_avatar)-[:LIKES]->(maya); 

Das sieht aus wie Graph

Jetzt im CQL, ich versuche Pfade zwischen 2 Knoten zu erreichen, wie folgende

  1. Wenn Startknoten und Endknoten sind nicht avatar , Rückwege, die keine Avatarknoten haben

  2. Wenn einer der Start- und Endknoten ein Avatar ist, geben Sie die Pfade wh zurück ich habe keinen Avatar Knoten in-zwischen

Um dies zu lösen, ich noch einer Eigenschaft Typ eingeführt: ‚Original‘ in Nicht-Avatar Knoten und versuchte, diese Abfrage

match p=({level:'start'})-[:LIKES*1..2]->({Type:'Original'})-[:LIKES*1..2]->({level:'end'}) return p 

Aber das ist immer noch die Rückkehr mir falsche Ergebnisse. Irgendeine Lösungsmöglichkeit? Oder ich gehe einen falschen Weg?

Dank

+0

Das Problem ist die [: LIKES * 1..2] ist die passenden Knoten, die Sie nicht wollen. –

Antwort

0

Das Problem ist die [: * LIKES 1..2] zurückkehrt Knoten, die Sie nicht wollen, so müssen sie wie so herausgefiltert werden:

match p=(b {level: "start"})-[r*1..4]-(e {level: "end"}) 
where all (var in nodes(p) where not exists(var.Type) or var = b or var = e) 
return p 

(A 1..4 Bereich bekommt mehr Ergebnisse)

Ich denke, die var = b oder var = e wird erlauben, dass die Endpunkte "avatar" Typ Knoten sind.

var in nodes p
extrahiert die Knoten aus dem Weg „p“ und die WHERE NOT EXISTS() überprüft die Knoten für die Eigenschaft „Type“ nicht dort zu sein.

+0

Würde das Pfade, die an Avatarknoten beginnen oder enden, nicht ausschließen? Mein zweites Ziel war: - Wenn einer der Start- und Endknoten ein Avatar ist, gibt es Rückwegpfade, die keine Avatarknoten zwischen – Rasyq

+0

haben. Ganz richtig .... Sie suchen im Grunde nach nicht-avatar Knoten zwischen den Endpunkten. Lass mich ein bisschen mehr darüber nachdenken ... –

+0

Ich habe die Antwort aktualisiert - funktioniert das? –

Verwandte Themen