我目前正在使用这个Neo4j架构:一个节点通过关系“CONTENTS”链接到另一个节点。假设我不知道自己会有多少级别。
目前,我有这个问题:
MATCH (p:Keyword)
OPTIONAL MATCH (p)-[:CONTENTS]->(p1)
OPTIONAL MATCH (p1)-[:CONTENTS]->(p2)
OPTIONAL MATCH (p2)-[:CONTENTS]->(p3)
OPTIONAL MATCH (p3)-[:CONTENTS]->(p4)
WITH p,p1,p2,p3,{uid: p4.uid, name: p4.name} as child4
WITH p,p1,p2,{uid: p3.uid, name: p3.name , children: collect(child4)} as child3
WITH p,p1,{uid: p2.uid, name: p2.name , children: collect(child3)} as child2
WITH p,{uid: p1.uid, name: p1.name , children: collect(child2)} as child1
WITH {uid: p.uid, name: p.name, children: collect(child1)} as child
RETURN {tree: collect(child)}
结果是我所需要的,但通过这种方式,我将结果限制在5个等级。如果不添加更多“OPTIONAL MATCH”,如何自动将此查询设置为多级?
感谢您的帮助:)
答案 0 :(得分:2)
不完全了解查询的所需输出应该是什么。
您需要通过使用量词*<lower>..<upper>
修改关系规范来使用可变路径长度匹配:
MATCH path=(p:Keyword)-[:CONTENTS*0..5]->(content) // match 0 to 5 CONTENTS hops
RETURN path, length(path) as len
ORDER BY len desc
LIMIT 1 // only proceed with longest path
编辑:
MATCH path=(p:Keyword)-[:CONTENTS*0..4]->(content)-[:CONTENTS]->(child)
RETURN content.uid, collect(child.uid) as children