我有一个与问here的问题类似的问题,但是,提出的解决方案对我不起作用。
我的Neo4j数据库有很多子图,每个子图包含不同数量的节点。
我想提取某种列表,其中包含所有分离的子图。
在给定的示例中,我想获得3个组,每个组包含该组代表的子图中的所有节点。
如何通过Cypher查询获取所有节点组?
我为此问题找到的所有解决方案都需要“ root”节点,在这种情况下,我没有这个节点。
答案 0 :(得分:3)
您可以使用graph algorithms插件,特别是connected components algorithm来标记图形中所有孤立的子图,然后将它们导出并在以后按集合ID导出时进行分组。
示例:
创建样本图
MERGE (nAlice:User {id:'Alice'})
MERGE (nBridget:User {id:'Bridget'})
MERGE (nCharles:User {id:'Charles'})
MERGE (nDoug:User {id:'Doug'})
MERGE (nMark:User {id:'Mark'})
MERGE (nMichael:User {id:'Michael'})
MERGE (nAlice)-[:FRIEND]->(nBridget)
MERGE (nAlice)-[:FRIEND]->(nCharles)
MERGE (nMark)-[:FRIEND]->(nDoug)
MERGE (nMark)-[:FRIEND]->(nMichael);
运行连接的组件(unionFind)算法,并在同一子图中返回节点:
CALL algo.unionFind.stream('User', 'FRIEND', {})
YIELD nodeId,setId
RETURN setId,collect(algo.getNodeById(nodeId)) AS nodes_from_specific_subgraph
这将返回:
╒═══════╤══════════════════════════════════════════════════╕
│"setId"│"specific_subgraph" │
╞═══════╪══════════════════════════════════════════════════╡
│4 │[{"id":"Doug"},{"id":"Mark"},{"id":"Michael"}] │
├───────┼──────────────────────────────────────────────────┤
│0 │[{"id":"Alice"},{"id":"Bridget"},{"id":"Charles"}]│
└───────┴──────────────────────────────────────────────────┘