使用Neo4j + Cypher查找节点及其连接的子图

时间:2015-02-23 14:03:09

标签: neo4j cypher graph-databases

我正在使用Neo4j 2.1.7和Node.js来构建REST API。数据 - 大约70.000个节点和100.000个关系 - 包含很多小的连接子图。

一个API调用,例如localhost:8000/search?name=Bussum,应返回名为Bussum的所有节点及其所属的连接组件。

插图:

Connected components

(图片来自Wikipedia

我可以通过这样的查询获得我需要的所有数据:

MATCH (a {name: "Bussum" })-[r*]-(b) 
UNWIND rels AS rel 
RETURN distinct startNode(rel) AS a, type(rel), endNode(rel) AS b

但是这样的查询只返回所有三元组(a)-[r]-(b)(未按组件/子图分组)。当然,我可以在Node.js中重建图形并自己找到子图,但这根本不是最好的解决方案。是否可以将返回的数据分组到子图/组件的数组/集合中?哪个Cypher查询更符合我的用例?或者我应该考虑使用Neo4j Java API吗?

谢谢! 伯特

2 个答案:

答案 0 :(得分:3)

您仍应将原始起点作为分组节点。

MATCH (root {name: "Bussum" })-[rels*]-(b) 
UNWIND rels AS rel 
RETURN root, 
       collect({start: startNode(rel), 
                 type:      type(rel), 
                  end:   endNode(rel)}) as component

答案 1 :(得分:1)

MATCH (a {name: "Bossum"})-[*0..]-(b)
WITH DISTINCT a, collect(DISTINCT b) AS sets
RETURN DISTINCT sets

此查询将返回(可能)许多行,其中每一行是节点的集合,这些节点构成一个完整的子图,使得每个子图尽可能大并且至少包含一个名为" Bossum" 。每一行(子图)都保证在结果集中是唯一的。

*我应该注意,我不知道这种方法的表现。