【问题标题】:Neo4J path enumerationNeo4J 路径枚举
【发布时间】:2017-07-22 12:07:49
【问题描述】:

目前正在分析两个节点之间的不同路径。为此,我需要某种方式从 Neo4J 返回的路径中唯一标识路径。

测试用例:

#MATCH (n:City) DETACH DELETE n;
CREATE (n:City { name: 'Rome' });
CREATE (n:City { name: 'London' });
CREATE (n:City { name: 'Berlin' });
CREATE (n:City { name: 'Madrid' });
MATCH (n:City),(m:City)
WHERE n.name = 'London' AND m.name = 'Madrid'
CREATE (n)-[r:Connected]->(m) RETURN r;
MATCH (n:City),(m:City)
WHERE n.name = 'Madrid' AND m.name = 'Berlin'
CREATE (n)-[r:Connected]->(m) RETURN r;
MATCH (n:City),(m:City)
WHERE n.name = 'Berlin' AND m.name = 'Rome'
CREATE (n)-[r:Connected]->(m) RETURN r;
MATCH (n:City),(m:City)
WHERE n.name = 'London' AND m.name = 'Berlin'
CREATE (n)-[r:Connected]->(m) RETURN r;
MATCH (n:City),(m:City) WHERE n.name = 'London' AND m.name = 'Rome'
CREATE (n)-[r:Express]->(m) RETURN r;

下面的查询工作正常

MATCH (n:City),(m:City)
WHERE n.name = 'London' AND m.name = 'Rome'
with n,m
match p= (n)-[*1..]->(m)
return p;

+---------------------------------------------------------------------------------------------------------------------------------------------+
| p                                                                                                                                                      |
+---------------------------------------------------------------------------------------------------------------------------------------------+
| (:City {name: "London"})-[:Connected]->(:City {name: "Madrid"})<-[:Connected]-(:City {name: "Berlin"})-[:Connected]->(:City {name: "Rome"}) |
| (:City {name: "London"})-[:Connected]->(:City {name: "Berlin"})<-[:Connected]-(:City {name: "Rome"})                                        |
| (:City {name: "London"})-[:Express]->(:City {name: "Rome"})                                                                                 |
+---------------------------------------------------------------------------------------------------------------------------------------------+

为了获得访问过的节点,我使用了查询:

MATCH (n:City),(m:City)
WHERE n.name = 'London' AND m.name = 'Rome'
with n,m
match p= (n)-[*1..]->(m)
unwind nodes(p) as n1 return n1;

+--------------------------+
| n1                       |
+--------------------------+
| (:City {name: "London"}) |
| (:City {name: "Madrid"}) |
| (:City {name: "Berlin"}) |
| (:City {name: "Rome"})   |
| (:City {name: "London"}) |
| (:City {name: "Berlin"}) |
| (:City {name: "Rome"})   |
| (:City {name: "London"}) |
| (:City {name: "Rome"})   |
+--------------------------+

但是,我需要一个属性来确定获取节点的路径,比如

+--------------------------+---------+
| n1                       | pathid  |
+--------------------------+---------+
| (:City {name: "London"}) | 1       |
| (:City {name: "Madrid"}) | 1       |
| (:City {name: "Berlin"}) | 1       |
| (:City {name: "Rome"})   | 1       |
| (:City {name: "London"}) | 2       |
| (:City {name: "Berlin"}) | 2       |
| (:City {name: "Rome"})   | 2       |
| (:City {name: "London"}) | 3       |
| (:City {name: "Rome"})   | 3       |
+--------------------------+---------+

我尝试使用密码 foreachreduce 运算符但没有成功。您能否提供一些关于如何枚举路径的指示?

谢谢 肯尼斯

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    我认为这样的事情可能适合你。

    MATCH (n:City),(m:City)
    WHERE n.name = 'London' AND m.name = 'Rome'
    WITH n,m
    MATCH p= (n)-[*1..]->(m)
    WITH COLLECT(p) as paths
    UNWIND RANGE(0,size(paths)-1) AS idx
    UNWIND NODES(paths[idx]) AS city
    RETURN city, idx
    

    如果您想节食,也可以像这样重写您的测试数据。

    CREATE (n1:City { name: 'Rome' })
    CREATE (n2:City { name: 'London' })
    CREATE (n3:City { name: 'Berlin' })
    CREATE (n4:City { name: 'Madrid' })
    CREATE (n2)-[:Connected]->(n4)
    CREATE (n4)-[:Connected]->(n3) 
    CREATE (n3)-[:Connected]->(n1) 
    CREATE (n2)-[:Connected]->(n3)
    CREATE (n2)-[:Express]->(n1);
    

    【讨论】:

      猜你喜欢
      • 2014-04-27
      • 2020-12-20
      • 2012-09-02
      • 1970-01-01
      • 2020-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-06
      相关资源
      最近更新 更多