我的图表只有一种类型的关系,没有标签,没有属性等。只是定向关系称为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等同于爵士乐。你知道吗?!
答案 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)