在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;
我尝试使用上面的查询,它使用了太多内存,因为它不返回结果。 想知道有没有简单的方法可以做到?
您可以使用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 │
└──────────────┘