在我的Neo4j 2.0服务器数据库中,我有一个森林,即一组树。我的一个用例是获取树节点的任意子集的子节点。
例如,我有根节点
root1 root2 root3 root4
现在我想要root1
和root4
的子节点。 我需要知道哪些孩子属于哪个。每个查询都是一个简单的MATCH Cypher查询。但是为了性能,我想在使用Neo4j服务器时保持较低的数据库调用量。因此,我正在考虑一种方法来告诉Cypher“给我root1和root4的子项,并告诉我哪个节点属于结果中的哪个根”。也就是说,我想到了一种地图。或者是结果集的集合,其中第一个元素是第一个根的子节点,第二个元素是第二个根的子节点等。
有没有办法在Cypher中执行此操作,还是我必须回到服务器插件?
谢谢你,最诚挚的问候!
修改
澄清:我主要担心的是我需要知道哪些孩子属于哪个孩子。例如,请考虑此命令生成的小图:
create (r1:ROOT {name:"root1"}),
(r2:ROOT {name:"root2"}),
(c11:CHILD {name:"child1_1"}),
(c12:CHILD {name:"child1_2"}),
(c13:CHILD {name:"child1_3"}),
(c21:CHILD {name:"child2_1"}),
(c22:CHILD {name:"child2_2"}),
(c23:CHILD {name:"child2_3"}),
(r1)-[:HAS_CHILD]->(c11),
(r1)-[:HAS_CHILD]->(c12),
(r1)-[:HAS_CHILD]->(c13),
(r2)-[:HAS_CHILD]->(c21),
(r2)-[:HAS_CHILD]->(c22),
(r2)-[:HAS_CHILD]->(c23)
在这里,我们分别为三个孩子提供root1
和root2
。
要获得root1
的孩子,我会发出以下问题:
MATCH (r:ROOT)-[:HAS_CHILD]->c where r.name='root1' RETURN collect(c)
现在我知道了根root1
的孩子。
问题是:查询如何查询root1
和root2
的子项,其结果将显示哪个子项属于哪个根的关联。因为查询清楚
MATCH (r:ROOT)-[:HAS_CHILD]->c where r.name='root1' OR r.name='root2' RETURN collect(c.id)
会给我两个孩子的根源。但现在我不知道哪个孩子有哪个根。那我该怎么办?
答案 0 :(得分:0)
您应该向我们提供更多详细信息,但是这样的查询(调整属性和关系)应该可以按照您的需要运行:
MATCH (child) <-[:HAS_CHILD]- (root:ROOT)
WHERE root.name IN ['root1','root4']
RETURN child, root