如何消除路径之外存在关系的路径,但路径中的节点之间?

时间:2015-06-08 11:37:16

标签: neo4j

我在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

感谢您阅读

2 个答案:

答案 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: trueKNOWS关系中存在LOVES属性,我认为这会更简单。

相关问题