Cypher中的路径属性

时间:2014-11-05 12:30:44

标签: graph neo4j cypher

我在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”节点

祝你好运

1 个答案:

答案 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能够帮助您的地方。您还应该确保如果您匹配的属性是正确索引的。