Neo4j 查找所有连接的节点

Neo4j 查找所有连接的节点,neo4j,cypher,Neo4j,Cypher,假设我正在创建以下数据库: 节点: 城市(id,可驾驶)、公路(id)、道路(id)等。 边缘: 已连接到 城市应与另一个城市的公路(或道路或其他任何东西)相连,而另一个城市可以通过相同或不同的道路等与另一个城市相连 结果,我将拥有城市->[连接到]->高速公路->[连接到]->城市->. 城市可以通过多种方式连接到另一个城市(想象两条平行公路) 我想选择所有连接到具有指定ID的城市的城市,但也不包括道路。现在我有一个问题: MATCH path = (city)-[:CONNECTED_WIT

假设我正在创建以下数据库:

节点:

城市(id,可驾驶)、公路(id)、道路(id)等。

边缘:

已连接到

城市应与另一个城市的公路(或道路或其他任何东西)相连,而另一个城市可以通过相同或不同的道路等与另一个城市相连

结果,我将拥有
城市->[连接到]->高速公路->[连接到]->城市->.

城市可以通过多种方式连接到另一个城市(想象两条平行公路)

我想选择所有连接到具有指定ID的城市的城市,但也不包括道路。现在我有一个问题:

MATCH path = (city)-[:CONNECTED_WITH*]-(connected_city)
WHERE id(city) = 15 AND ALL(node IN nodes(path) WHERE NOT node:Road)
RETURN city, relationships(path) as r, connected_city
如果城市仅通过一种方式连接到另一个城市,这将非常有效。当我提到连接相同城市的两条平行公路时,问题就开始了。然后,这个查询将导致无限循环(至少我相信)。我认为它找到了从第一个城市到第二个城市的路径,然后回到第一个城市,依此类推。我不能限制到达目标的跳数,因为它是可变的

关于如何实现这一点,您有什么想法吗?

您可以使用它来获取所有连接的节点,并绕过可能导致此类查询永远旋转的密码限制,但这有一个缺点。实现这种效率的方法是只通过一条不同的路径访问每个不同的节点一次(从而减少查询生成的路径数量,并在找到多条路径时将它们忽略到同一节点),因此您不会得到所有节点的所有可能路径,而只是一条可能路径

如果这是可以接受的,那么您应该能够使用APOC路径扩展器实现您想要的,特别是
APOC.path.spanningTree()
(因为它返回到每个节点的路径)或
APOC.path.subgraphNodes()
(如果您只需要连接的节点而不需要到它们的路径)。我们可以使用标签过滤器来确保连接节点的路径不包括:Roads,并且始终结束于:City节点

MATCH (city)
WHERE id(city) = 15
CALL apoc.path.spanningTree(city, {labelFilter:'-Road|>City', relationshipFilter:'CONNECTED_WITH'}) YIELD path
WITH city, path
WHERE length(path) <> 0
RETURN city, relationships(path) as r, last(nodes(path)) as connected_city
匹配(城市)
其中id(城市)=15
调用apoc.path.spanningTree(city,{labelFilter:'-Road |>city',relationshipFilter:'CONNECTED_WITH'})产生路径
城市、道路
其中长度(路径)为0
返回城市,关系(路径)为r,最后一个(节点(路径))为连接的城市

虽然您不会在Cypher中获得无限循环(因为每个路径不能多次遍历同一关系),但当与以前访问过的城市存在多个关系时,您将获得重新访问这些城市的路径。图形中可能的路径数可能非常高,因此可能不完整。有一些方法可以在扩展过程中获得不同的城市,或者使用APOC过程防止重新访问节点,但是您可能需要删除返回中的关系,或者满足于每个城市只能得到一条路径,而不是所有路径。我将对此进行测试,因为它看起来很有希望。在检索到所有节点后,我可以轻松地获取所有路径,这应该可以通过您的查询实现