Neo4j cyper查询:如何travese

时间:2017-02-15 01:40:30

标签: neo4j

我正在尝试学习neo4j,所以我只是用一个旅行应用程序的用例来学习,但我不确定解决它的最佳方法。任何帮助将不胜感激。

提前致谢。

因此,考虑一个用例,我必须乘坐火车从一个地方( PLACE A )到其他地方( PLACE C ),但没有直接联系两地之间。所以我们必须在 PLACE B 中改变我们的列车。

通过关系 IS_CONNECTED 关系连接两个地方。 引用图像中的绿色节点

然后如果两个地方之间存在is_connected关系,则会有一个外向关系,即 CONNECTED_VIA 来自两个节点的公共列车,这意味着它们如何连接指的是图像中的红色节点

我的问题是我们怎么想知道我们必须从地方改变电台b

我的理解是:

  1. 我们将通过IS_CONNECTED关系

    检查两个地方的连接位置

    匹配(开始:地点{名称:"海德堡"}),(结束:地点{名称:"法兰克福"}) MATCH路径=(开始) - [:IS_CONNECTED * ..] - >(结束) 返回路径

  2. 这将显示这两个地方已连接

    1. 然后我们将看到,如果地点A和地方c是否通过查询直接连接

      匹配(p:place {name:" heidelberg"}) - [:CONNECTED_VIA] - >(q)< - [:CONNECTED_VIA] - (t:place {name:&#34 ;法兰克福"}) 返回q

    2. 这将不会返回任何内容,因为没有直接连接

      1. 此后我的大脑停止运作。我想弄清楚过去3天的情况。对不起,我很困惑
      2. Please click here for the image of what i am referring

1 个答案:

答案 0 :(得分:0)

您希望在:CONNECTED_VIA匹配中使用可变长度关系,然后获取:放置路径中的节点。使用上限通常是一个好主意,无论你的图表中有什么意义。

然后我们可以在路径中的节点上使用过滤器,只保留以下节点:放置节点。

match path = (p:place{name:"heidelberg"})-[:CONNECTED_VIA*..4]-(t:place{name:"frankfurt"}) 
return path, [node in nodes(path)[1..-1] where node:Place] as connectionPlaces

如果您只对最短路径感兴趣,可以查看shortestPath() or shortestPaths() functions

最后要注意的一点是......在确定两个位置是否已连接时,如果您需要的是真或假,如果它们已连接,您可以使用EXISTS()函数返回是否有这样的模式存在:

match (start:place{name:"heidelberg"}), (end:place{name:"frankfurt"}) 
return exists((start)-[:IS_CONNECTED*..5]->(end))