Neo4j Cypher查询以基于起始条件列出具有单个关系的节点的路径

时间:2015-01-10 10:01:52

标签: neo4j cypher

我的图表只有一种类型的关系,没有标签,没有属性等。只是定向关系称为NT

每个节点都有一组属性。基于该属性,我想显示起始节点具有codeqty > 0以及codes属性的所有路径(链),但所有下一个节点都是codeqty = 0(空{{1}直到在链中发生了另一个节点codes和不同codeqty > 0属性的文本或不管codes属性。

所以我需要获得所有具有任何深度的节点,如伪代码模式:

codes(作为起点条件)

...

(n)-[:NT]->(m) where n.codeqty > 0 and m.codeqty = 0(作为终点条件)

或者只是通过会见任何下一个(m)-[:NT]->(p) where m.codeqty = 0 and p.codeqty > 0 and n.codes <> p.codes,无论{/ 1}}属性如何

p.codeqty > 0(作为终点条件)

我需要显示codes(m)-[:NT]->(p) where m.codeqty = 0 and p.codeqty > 0结尾的(最短或任意)路径,因为(n)->...->(m)在停止条件下不属于此链。

它是否也受到深度限制?

顺便说一下,通过使用节点属性而不是关系属性,是否真的可以这样做?如果没有,请制作一个如何操作的片段。

非常感谢你!

PS。任何版本的neo4j都是受欢迎的。我使用的是最新的2.20

UPD

我有这样的想法(n,p,m变量可能与上面不同,但你明白了)

(m)

2跳似乎没问题:

(p)

自3个或更多跳以来它开始变得混乱:

MATCH (n)-[:NT]->(p)<-[:NT]-(m) WHERE n.codes = m.codes AND n.codeqty > 0 AND p.codeqty = 0

据我能够手动检查。

我觉得它可以完美地完成并通过使用类似SQL窗口函数(如PARTITION BY ROW_NUMBER for SQL Server)之类的东西来过滤掉。我不知道任何Cypher等同于爵士乐。你知道吗?!

1 个答案:

答案 0 :(得分:4)

您正在寻找的是可变长度路径,如上一个示例中的路径,与集合函数和谓词相结合。

MATCH path = (n)-[:NT*1..3]->(p) 
WHERE n.codeqty > 0 
AND ALL(x in tail(nodes(path)) WHERE x.codeqty = 0) 
AND NOT (p)-[:NT]->()

如果要比较集合中的节点,则必须求助于基于索引的访问

WITH nodes(path) as nodes
AND ALL(idx in range(0,size(nodes)-2) WHERE nodes[idx].codes <> nodes[idx+1].codes)