2015-02-23 178 views
5

我使用Neo4j 2.1.7和Node.js来构建REST API。数据 - 大约70,000个节点和100.000个关系 - 包含很多小的连接子图。用Neo4j + Cypher查找节点及其连接的子图

一个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呢?

谢谢! Bert

+0

子图是多么“小”?图中的那些代表最小到最大? – 2015-02-23 15:24:24

+0

一些包含一个顶点,大约100个,但大多数在5和10之间。 – Bert 2015-02-23 16:04:45

+0

做每个特定子图中的节点是否具有该子图的唯一标识符? – 2015-02-23 16:07:43

回答

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 
+0

通过'root'分组会返回一个包含所有路径中所有关系的集合。相反,我认为分组应该由'rels'完成。 – zaboco 2015-02-24 13:25:19

+0

这个操作有没有名字? (找到包含特定节点的最大子图) – 2016-12-21 17:25:32

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

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

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

相关问题