带有密码的自动多级树

时间:2014-10-28 09:24:21

标签: tree neo4j cypher

我目前正在使用这个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”,如何自动将此查询设置为多级?

感谢您的帮助:)

1 个答案:

答案 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
相关问题