cypher 查询 - 如何计算 cypher 中的人员簇数

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

在neo4j cypher查询中,我有person节点,并且person彼此认识。 我如何找出有多少人集群?另外,我怎样才能找到有多少个集群有超过一个人?

MATCH (p1:person)-[:know*]->(p2:person)
WHERE id(p1) < id(p2)
WITH collect(DISTINCT p1) + collect(DISTINCT p2) AS groupNodes
UNWIND groupNodes AS node
WITH DISTINCT node AS person, groupNodes
RETURN count(DISTINCT groupNodes) AS numberOfGroups;

我尝试使用上面的查询,它使用了太多内存,因为它不返回结果。 想知道有没有简单的方法可以做到?

charts neo4j cypher opencypher
1个回答
0
投票

您可以使用neo4j图形数据科学库弱连接组件算法,该库必须安装在neo4j服务器上。

作为示例,我们首先创建一些示例数据:

CREATE
  (nAlice:Person {name: 'Alice'}),
  (nBridget:Person {name: 'Bridget'}),
  (nCharles:Person {name: 'Charles'}),
  (nDoug:Person {name: 'Doug'}),
  (nMark:Person {name: 'Mark'}),
  (nMichael:Person {name: 'Michael'}),
  (nStan:Person {name: 'Stan'}),

  (nAlice)-[:KNOWS]->(nBridget),
  (nAlice)-[:KNOWS]->(nCharles),
  (nMark)-[:KNOWS]->(nDoug),
  (nMark)-[:KNOWS]->(nMichael)

然后,创建一个 GDS 投影(指定节点和关系的内存中副本,供 GDS 算法使用):

CALL gds.graph.project(
  'myGraph',
  'Person',
  'KNOWS'
)

然后,运行WCC算法,检测通过

KNOWS
关系连接的节点的社区,并返回有多少个社区(未与其他任何人连接的
Person
有他/她自己的由1人组成的社区) .

CALL gds.wcc.stream('myGraph') YIELD componentId
RETURN COUNT(DISTINCT componentId) AS numberOfGroups

结果是:

╒══════════════╕
│numberOfGroups│
╞══════════════╡
│3             │
└──────────────┘
© www.soinside.com 2019 - 2024. All rights reserved.