Neo4j 密码查询,用于根据开始-结束条件列出具有单个关系的节点的路径



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

每个节点都有一组属性。基于该属性,我想显示开始节点与codes属性一起codeqty > 0的所有路径(链),但所有下一个节点都codeqty = 0(具有空的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(作为终点条件)

或者只是通过满足任何下一个p.codeqty > 0不管codes属性,例如

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

我需要显示以 (n)->...->(m) (m)结尾的(最短或任何)路径,因为根据停止条件(p)不属于此链。

作为选项,它是否也可以受到深度的限制?

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

非常感谢!

附言。欢迎任何版本的neo4j。我使用的是最新的 2.20

UPD

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

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

2 跳似乎还可以:

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

从 3 个或更多跃点开始搞砸:

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

据我能够手动检查。

我觉得它可以通过使用SQL窗口函数(如SQL Server的PARTITION BY ROW_NUMBER)之类的东西完美地完成并过滤掉。我不知道那个爵士乐有什么密码等价物。你知道吗?!

您要查找的是可变长度路径,如上一个示例中所示,并结合了集合函数和谓词。

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) 

最新更新