我正在使用Neo4j 2.1.7和Node.js来构建REST API。数据 - 大约70.000个节点和100.000个关系 - 包含很多小的连接子图。
一个API调用,例如localhost:8000/search?name=Bussum
,应返回名为Bussum
的所有节点及其所属的连接组件。
插图:
(图片来自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吗?
谢谢! 伯特
答案 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" 。每一行(子图)都保证在结果集中是唯一的。
*我应该注意,我不知道这种方法的表现。