我的图只有一种关系类型,没有标签,没有属性等。只是定向关系称为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)