【问题标题】:Get complete path from a sequence of nodes from Neo4j Graph database with Cypher使用 Cypher 从 Neo4j Graph 数据库中的一系列节点获取完整路径
【发布时间】:2016-01-06 05:50:15
【问题描述】:

我正在存储一个节点序列,其中一个节点与序列中的前一个节点以及表示“对象”的另一个节点相关。所以例如我可能有这个序列:

(S1)<-[r]-(S2)<-[r]-(S3)<-[r]-(S4)

然后序列中的每个节点都与另一个节点相关,例如:

(S1)-[r]->(O1)
(S2)-[r]->(O2)
(S3)-[r]->(O1)
(S4)-[r]->(O3)

在本例中,S1 和 S3 都与 O1 相关。

我想要实现的是将起点指定为“O1”,并能够在上面的示例中获得从 S1 到 S4 的完整路径。

我能够通过在 S1 中添加一个名为“start”的属性和在 S4 中添加另一个名为“end”的属性来表示序列的开始和结束,并使用此查询仅获取完整序列:

MATCH (O:Obj{name:'O1'}), 
path=(O)<-[:OBJECT]-(first:SEQ)<-[:PREV*]-(last:SEQ) 
WHERE has(first.start) 
AND has(last.end) 
return path

但是,我想知道如果没有“开始”和“结束”属性,是否有更好的方法来实现这一点。我在不使用属性时遇到的问题是序列被分解,所以我得到的不是一个序列:

(S1)<-[r]-(S2)
(S1)<-[r]-(S2)<-[r]-(S3)
(S1)<-[r]-(S2)<-[r]-(S3)<-[r]-(S4)
(S3)<-[r]-(S4)

是否有可能只获得完整的序列?

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    您可以只要求 last 位于“链的末端”:

    MATCH path=(:Obj {name:'O1'})<-[:OBJECT]-(:SEQ)<-[:PREV*]-(last:SEQ)
    WHERE NOT (last)<-[:PREV]-(:SEQ)
    RETURN path
    

    【讨论】:

    • 这就是我需要的!当序列中的节点与第一个节点匹配时,我只需要进行一些小修改即可过滤掉。所以我最终得到了这个: MATCH path=(O:Obj {name:'O1'})(:SEQ) 返回路径
    • 请记住accept最适合您的答案。
    【解决方案2】:

    是的,你可以。您只需按大小对生成的路径进行降序排序,然后只返回最长的路径。

    match p=(:Obj {name:'O1'})<-[:REL]-(:SEQ)<-[:PREV*]-(:SEQ)
    with p, size(nodes(p)) as seq_length
    order by seq_length desc
    limit 1
    return tail(nodes(p))
    

    【讨论】:

    • 这仅在我有一个序列时有效,但在我的图表中我有许多序列,我希望能够根据某些条件获得所有序列。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多