按属性查找多个节点之间的路径

时间:2018-01-26 21:58:32

标签: neo4j cypher

所以我试图找到我选择的节点和属性之间的所有节点,名为Stop:true。注意:我希望它包含停止节点。

所以如果我有一组这样的节点:

(id:1,Stop:false)-(id:2,Stop:false)-(id:3,Stop:false)-(id:4,Stop:false)-
(id:5,Stop:false)-(id:6,Stop:True)-(id:7,Stop:false)-(id:8,Stop:false)

它会回来     (ID:1,停止:假) - (ID:2,停止:假) - (ID:3,停止:假) - (ID:4,停止:假) -     (ID:5,停止:假) - (ID:6,停止:真)

到目前为止我已经

MATCH p=(a:Node{id:1})-[*]-(b:Node)
WHERE NOT b.Stop = true
RETURN p

但是此查询仍会返回连接到停止节点的节点。如何让它显示直到停止节点的所有节点?

1 个答案:

答案 0 :(得分:1)

以下查询应返回从您选择的节点到Stop节点的每条路径(即,Stop值为true的节点。如果您的数据库具有多个Stop节点的路径,则此查询将返回每个Stop节点的路径(这意味着某些返回的路径可能包含多个Stop节点)。

MATCH p=(a:Node{id:6})-[*]-(b:Node {Stop: true})
RETURN p;

但是,如果您只想要具有单个Stop节点的路径(在末尾),那么此查询应该有效:

MATCH p=(a:Node{id:6})-[*]-(b:Node {Stop: true})
WHERE NONE(n IN NODES(p)[1..-1] WHERE n.Stop)
RETURN p;

[注]

可变长度路径模式(如()-[*]-())具有指数时间和空间复杂度。如果节点的平均度数是X,则遍历可变长度路径到深度Y会产生O(X ^ Y)的复杂度。您通常需要在可变长度模式(例如,()-[*..5]-())上指定合理的上限,以避免内存不足或查询似乎永远运行。您指定的上限取决于查询的性质和实际数据特征。