在neo4j中将多条路径合并为一条

在neo4j中将多条路径合并为一条,neo4j,Neo4j,我想合并来自多个匹配查询的路径。考虑一个查询 MATCH path_1 = (t1:Type1)-[r1:]->(t2:Type2) MATCH path_2 = (t2)-[r2]->(t3:Type3) MATCH path_3 = (t1)-[r3]->(t4:Type4) RETURN path_1,path_2,path_3 如何将这三条路径合并为一条 apoc.path.combine(path_1,path_2)作为path,但它只合并了两个 路径。我想

我想合并来自多个匹配查询的路径。考虑一个查询

MATCH path_1 =  (t1:Type1)-[r1:]->(t2:Type2)
MATCH path_2 =  (t2)-[r2]->(t3:Type3) 
MATCH path_3 =  (t1)-[r3]->(t4:Type4)
RETURN path_1,path_2,path_3
  • 如何将这三条路径合并为一条
    apoc.path.combine(path_1,path_2)作为path
    ,但它只合并了两个 路径。我想合并三条以上的路径
  • Neo4j浏览器如何使用上述查询给出的输出呈现图形

  • 实际上有两种可能的解决方案,结合path或使用APOC创建path

    如下图所示:

    CREATE (p:Person {name: "John"})-[:WORKS_FOR]->(c:Company {name: "Acme"})
    CREATE (c)-[:HAS_PHONE]->(pn:PhoneNumber {number : 123345})
    CREATE (pn)<-[:PROVIDES]-(pr:TelcoProvider {name: "Vodafone"})
    
    组合路径

    为此,您可以从第一条路径开始使用累加器,然后使用
    apoc.path.combine减少剩余路径:

    MATCH p1=(p:Person)-[:WORKS_FOR]->(c)
    MATCH p2=(c)-[:HAS_PHONE]->(phone)
    MATCH p3=(phone)-[r:PROVIDES]-(provider)
    WITH p1, [p2,p3] AS paths
    RETURN reduce(acc = p1, x IN paths | apoc.path.combine(acc, x))
    

    创建路径

    第二种解决方案是从第一个节点创建路径,并添加所有关系:

    MATCH p1=(p:Person)-[r:WORKS_FOR]->(c)
    MATCH p2=(c)-[r2:HAS_PHONE]->(phone)
    MATCH p3=(phone)-[r3:PROVIDES]-(provider)
    RETURN apoc.path.create(p, [r,r2,r3])
    

    这将产生与上面相同的结果。

    您可以收集路径,然后在结果列表上调用REDUCE:。然后可以在REDUCE中使用apoc.path.combine。
    MATCH p1=(p:Person)-[r:WORKS_FOR]->(c)
    MATCH p2=(c)-[r2:HAS_PHONE]->(phone)
    MATCH p3=(phone)-[r3:PROVIDES]-(provider)
    RETURN apoc.path.create(p, [r,r2,r3])