我正在尝试学习neo4j,所以我只是用一个旅行应用程序的用例来学习,但我不确定解决它的最佳方法。任何帮助将不胜感激。
提前致谢。
因此,考虑一个用例,我必须乘坐火车从一个地方( PLACE A )到其他地方( PLACE C ),但没有直接联系两地之间。所以我们必须在 PLACE B 中改变我们的列车。
通过关系 IS_CONNECTED 关系连接两个地方。 引用图像中的绿色节点
然后如果两个地方之间存在is_connected关系,则会有一个外向关系,即 CONNECTED_VIA 来自两个节点的公共列车,这意味着它们如何连接指的是图像中的红色节点
我的问题是我们怎么想知道我们必须从地方改变电台b
我的理解是:
我们将通过IS_CONNECTED关系
检查两个地方的连接位置匹配(开始:地点{名称:"海德堡"}),(结束:地点{名称:"法兰克福"}) MATCH路径=(开始) - [:IS_CONNECTED * ..] - >(结束) 返回路径
这将显示这两个地方已连接
然后我们将看到,如果地点A和地方c是否通过查询直接连接
匹配(p:place {name:" heidelberg"}) - [:CONNECTED_VIA] - >(q)< - [:CONNECTED_VIA] - (t:place {name:&#34 ;法兰克福"}) 返回q
这将不会返回任何内容,因为没有直接连接
答案 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))