我有一张图表。一些节点是角色扮演,例如一个节点Leena还有一个头像AltLeena。 Leena可以有很多化身。
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);
现在在CQL中,我正在尝试实现任意2个节点之间的路径,如下所示
如果起始节点和结束节点不是头像,则返回没有头像节点的路径
如果起始节点和结束节点中的任何一个是头像,则返回中间没有头像节点的路径
为了解决这个问题,我在非头像节点中引入了另外一个属性Type:'Original'并尝试了这个查询
match p=({level:'start'})-[:LIKES*1..2]->({Type:'Original'})-[:LIKES*1..2]->({level:'end'}) return p
但这仍然给我错误的结果。有解决方案吗或者我采取了错误的做法?
由于
答案 0 :(得分:0)
问题是[:LIKES * 1..2]返回了你不想要的节点,所以需要像这样过滤掉它们:
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范围获得更多结果)
我认为 var = b或var = e 将允许端点为“头像”类型节点。
var in nodes p从路径“p”中提取节点,WHERE NOT EXISTS()检查节点中是否存在“类型”属性而不是。