如何找到具有“k”个关系的共连接节点? - Neo4j

问题描述 投票:0回答:1

我有一个大型 Neo4j 数据库,下面是节点和关系的小子集。 enter image description here

我有 3 种不同类型的节点:

  • (粉色)顾客
  • (蓝色)交易
  • (黄色)端子

使用 Cypher 很容易找到下面的模式,只需使用

MATCH
指示模式即可。

c1 -[:MADE]-> 交易 1 -[:AT]-> 终端 <-[:AT]- transaction2 <-[:MADE]- c2

我们认为这意味着

c2
节点是
c1
的第二个连接度邻居。

但是这可以简单地针对连接度 2 来完成。对于 k>2 ,我如何找到给定客户节点的第

k
连接度邻居?我只寻找
Customer
邻居节点。

我正在使用 Python 在 neo4j 中执行我的密码查询。我知道我也许可以在查询字符串中附加模式

k
次来实现这一目标,但我想知道是否可以在一个特定的密码查询中指示这一点。

如果有任何解决方案可以让我在密码查询中明确选择

k
,那就太好了。我找不到类似的东西。

database graph neo4j nosql cypher
1个回答
0
投票

要获取与

Customer
Customer
节点相距四度的所有
id = 'c1'
节点,您可以使用以下命令:

MATCH (c1:Customer {id: 'c1'})
      (()-[:MADE]->(:Transaction)-[:AT]->(:Terminal)
         <-[:AT]-(:Transaction)<-[:MADE]-(:Customer)){4} (c2)
WHERE c1 <> c2
RETURN DISTINCT c2

请注意,您所说的第二度连接在这里将是第一度。

该解决方案忽略了这样一个事实:可能有多个不同长度的路径连接给定的节点对。要仅返回每个

Customer
节点的最小度数,请找到每对之间的最短路径:

MATCH SHORTEST 1
      (c1:Customer {id: 'c1'})
      (()-[:MADE]->(:Transaction)-[:AT]->(:Terminal)
         <-[:AT]-(:Transaction)<-[:MADE]-(:Customer)){4} (c2)
WHERE c1 <> c2
RETURN DISTINCT c2

这些解决方案使用量化路径模式最短路径

© www.soinside.com 2019 - 2024. All rights reserved.