我在Neo4j中有以下图表
(id:5,t:e)<--(id:4,t:w)<--(id:0;t:s)-->(id:1,t:w)-->(id:2,t:b)-->(id:3,t:e)
现在我搜索从t:s
的节点到t:e
的节点的路径,这样只有列有白名单的t:w
节点位于其间。
理想情况下,我需要一个只返回(0)的查询 - &gt;(4) - &gt;(5)但不返回(0) - &gt;(1) - &gt;(2) - &GT;(3)
编辑:我忘了提到路径可能有不同的长度:从0到潜在无穷大。这意味着我可能有任意数量的“t:w”节点
祝你好运
答案 0 :(得分:1)
只使用您在上面提供的信息,您可以使用
MATCH p=({t:'s'})-->({t:'w'})-->({t:'e'}) RETURN p
当然,如果s
可以直接链接到e
,则需要使用可变长度关系匹配。
MATCH p=({t:'s'})-[*0..1]->({t:'w'})-[]->({t:'e'})
RETURN DISTINCT p
编辑 - 任意长度的路径
MATCH p=({t:'s'})-[*0..1]->({t:'w'})-[*]->({t:'e'})
RETURN DISTINCT p
要匹配任意长度的路径,请使用关系路径匹配中的*
运算符。通常最好在该匹配上加上一些界限,其中一个例子是*0..1
(长度为0到1)。您可以将任一端打开*..6
(长度为1到6)或*2..
(长度为2)。
问题在于,现在您无法保证中间节点中的节点类型(因此t:"b"
将匹配)。为了避免这种情况,我认为你必须过滤。
MATCH p=({t:'s'})-[*]->({t:'e'})
WHERE ALL (node IN NODES(p)
WHERE node.t = 's' OR node.t = 'w' OR node.t = 'e' )
RETURN p
结束修改
您应该为节点引入标签,并使用关系类型进行遍历,因为这是Neo / Cypher能够帮助您的地方。您还应该确保如果您匹配的属性是正确索引的。