我在this console修改了'vanilla'初始查询,并在'Morpheus'和'Cypher'节点之间添加了一个关系类型'LOCKED'。
如何修改现有(首次运行)查询,这是一个可变长度路径,以便由于我添加了额外的锁定关系而不再到达Agent Smith节点?
首次运行查询:
MATCH (n:Crew)-[r:KNOWS|LOVES*2..4]->m
WHERE n.name='Neo'
RETURN n AS Neo,r,m
我尝试过这种事:
MATCH p=(n:Crew)-[r:KNOWS|LOVES*2..4]->m
WHERE n.name='Neo'
AND none(rel IN rels(p) WHERE EXISTS (StartNode(rel)-[:LOCKED]->EndNode(rel)))
RETURN n AS Neo,r,m
..但它无法识别none()函数中的模式。
我正在使用社区2.2.1
感谢您阅读
答案 0 :(得分:3)
我很确定你不能像MATCH
y类型那样使用函数(虽然它很聪明)。那怎么样?
MATCH path=(neo:Crew)-[r:KNOWS|LOVES|LOCKED*2..4]->m
WHERE neo.name='Neo'
AND NOT('LOCKED' IN rels(path))
RETURN neo,r,m
编辑:
哎呀,看起来Dave可能会打败我。这是我提出的解决方案;)MATCH p=(neo:Crew)-[r:KNOWS|LOVES*2..4]->m
WHERE neo.name='Neo'
WITH p, neo, m
UNWIND rels(p) AS rel
MATCH (a)-[rel]->(b)
OPTIONAL MATCH a-[locked_rel:LOCKED]->b
WITH neo, m, collect(locked_rel) AS locked_rels
WHERE none(locked_rel IN locked_rels WHERE ()-[locked_rel]->())
RETURN neo, m
答案 1 :(得分:2)
好的,这有点令人费解,但我认为它有效。方法是采用所有路径并找到最后已知的良好节点(具有LOCKED关系的节点离开它们)。然后使用该节点作为新的结束点并返回路径。
match p=(n:Crew)-[r:KNOWS|LOVES|LOCKED*2..4]->m
where n.name='Neo'
with n, relationships(p) as rels
unwind rels as r
with n
, case
when type(r) = 'LOCKED' then startNode(r)
else null
end as last_good_node
with n
, (collect( distinct last_good_node)) as last_good_nodes
unwind last_good_nodes as g
match p=n-[r:KNOWS|LOVES*]->g
return p
如果locked: true
和KNOWS
关系中存在LOVES
属性,我认为这会更简单。