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

Neo4j Cypher查询,根据开始-结束条件列出具有单个关系的节点路径,neo4j,cypher,Neo4j,Cypher,我的图形是唯一一种没有标签、没有属性等的关系类型。这就是所谓的NT 每个节点都有一组属性。基于该属性,我想显示所有路径链,其中开始节点的codeqty>0以及codes属性,但接下来的所有节点都是codeqty=0,带有空codes属性,直到链中出现另一个节点,codeqty>0,并且通过其文本或不考虑codes属性显示不同的codes属性 因此,我需要获得所有具有任意深度的节点,如伪代码模式: n-[:NT]->m,其中n.codeqty>0和m.codeqty=0作为起点条件 m-[:NT

我的图形是唯一一种没有标签、没有属性等的关系类型。这就是所谓的NT

每个节点都有一组属性。基于该属性,我想显示所有路径链,其中开始节点的codeqty>0以及codes属性,但接下来的所有节点都是codeqty=0,带有空codes属性,直到链中出现另一个节点,codeqty>0,并且通过其文本或不考虑codes属性显示不同的codes属性

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

n-[:NT]->m,其中n.codeqty>0和m.codeqty=0作为起点条件

m-[:NT]->p,其中m.codeqty=0,p.codeqty>0,n.CODE p.CODE作为终点条件

或者只需满足任何下一个p.codeqty>0,而不考虑代码属性,如

m-[:NT]->p其中m.codeqty=0和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的按行分区)可以完美地完成并过滤掉它。我不知道那爵士乐有什么密码。你知道吗

您要寻找的是与上一个示例类似的可变长度路径,以及集合函数和谓词

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)