Neo4j-从neo4j数据库中提取所有子图

时间:2018-11-23 13:51:21

标签: neo4j cypher

我有一个与问here的问题类似的问题,但是,提出的解决方案对我不起作用。

我的Neo4j数据库有很多子图,每个子图包含不同数量的节点。

我想提取某种列表,其中包含所有分离的子图。

enter image description here

在给定的示例中,我想获得3个组,每个组包含该组代表的子图中的所有节点。

如何通过Cypher查询获取所有节点组?

我为此问题找到的所有解决方案都需要“ root”节点,在这种情况下,我没有这个节点。

1 个答案:

答案 0 :(得分:3)

您可以使用graph algorithms插件,特别是connected components algorithm来标记图形中所有孤立的子图,然后将它们导出并在以后按集合ID导出时进行分组。

示例:

enter image description here

创建样本图

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"}]│
└───────┴──────────────────────────────────────────────────┘