Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 如何消除路径外部存在关系,但路径中节点之间存在关系的路径?_Neo4j - Fatal编程技术网

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

Neo4j 如何消除路径外部存在关系,但路径中节点之间存在关系的路径?,neo4j,Neo4j,我在中修改了“vanilla”初始查询,并在“Morpheus”和“Cypher”节点之间添加了一种关系类型“LOCKED” 如何修改现有的(首次运行)查询,该查询是一个可变长度的路径,因此由于我添加了额外的锁定关系,它不再到达代理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|L

我在中修改了“vanilla”初始查询,并在“Morpheus”和“Cypher”节点之间添加了一种关系类型“LOCKED”

如何修改现有的(首次运行)查询,该查询是一个可变长度的路径,因此由于我添加了额外的锁定关系,它不再到达代理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


感谢您阅读

我很确定您不能在
匹配
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
编辑:

哎呀,看来戴夫可能已经赢了我。这是我想出的解决办法;)


好的,这有点复杂,但我认为它是有效的。方法是采用所有路径,并找到最后已知的好节点(具有锁定关系的节点)。然后将该节点用作新的端点并返回路径

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
属性,这会更简单。

Hrm,我意识到你想要的是找到既有
知道|爱
又有
locked
的链接,并排除那些路径。。。我想如果你在匹配行之后的WHERE子句中使用了这个函数,它似乎在自己的WHERE子句中识别出了明显的模式,但是当你尝试使用像我上面提到的StartNode(rel)这样的“指针”时,它就失败了。编译器对此没有问题,例如:MATCH(n:Crew)-[r:KNOWS | LOVES*2..4]->m WHERE n.name='Neo'和NONE(rel IN r WHERE Exists((n)-[:LOCKED]->(m)))返回n作为Neo,r,m…尽管,这永远不会达到我想要的效果。我喜欢这个解决方案,Brian,但我是否丢失了原始路径?我似乎不能毫无异议地把它通到陈述的结尾。我使用了这个陈述。布莱恩,如果它被修改正确,你想稍微改变一下你的答案吗?匹配p=(neo:Crew)-[r:KNOWS | LOVES*2..4]->m WHERE neo.name='neo'与p,neo,m将rels(p)作为rel匹配(a)-[rel]->(b)可选匹配a-[locked_rel:locked]->b与neo,m,收集(locked_rel)作为locked_rels,其中没有(locked_rel IN locked_rels WHERE()-[locked_rel]->)返回neo,有很多想法如何保留原始路径,然后Brian?我试过这个,但它抱怨:匹配p=(neo:Crew)-[r:KNOWS | LOVES*2..4]->m WHERE neo.name='neo'与p,neo,m将rels(p)作为rel匹配(a)-[rel]->(b)可选匹配a-[locked_rel:locked]->b与p,neo,m,collect(locked_rel)作为locked(在locked)rels WHERE()-[locked)返回p,neo,若要在关系上拥有一个属性,您可能会将其同时放在这两个属性上,因为这两个属性都可以存在。这看起来有点混乱-同意-我猜这只是转移了他们的问题我还没试过你的答案Dave,看起来它应该适用于演示图,但是,当应用到一个更大的图时,第二个匹配是否有机会选择一个不同于原始匹配的路由,它们之间有一个锁定关系的节点对?是的-我想说,考虑到它当前的编写方式,这肯定是它的工作方式(我非常关注样本数据)。我认为它必须添加一些逻辑,以便只收集路径中第一个
锁定的
关系的开始节点。这样,如果路径包含多个锁定关系,则在后续路径匹配中仅使用第一个锁定关系。我可以稍后试一试,看看我是否能把它整理好。我只是想知道,这种“从蛇的头上砍下蛇”的方法,虽然非常聪明(也许有点残忍),但是否意味着你失去了识别这条蛇的潜力。我知道我还没有这样规定,但是如果您正在查找m上的属性,那么最后一个好的节点可能还没有这些相同的属性。
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