Cypher:一次调用中有多个独立查询

时间:2014-01-08 10:26:14

标签: neo4j cypher

在我的Neo4j 2.0服务器数据库中,我有一个森林,即一组树。我的一个用例是获取树节点的任意子集的子节点。

例如,我有根节点

root1 root2 root3 root4

现在我想要root1root4的子节点。 我需要知道哪些孩子属于哪个。每个查询都是一个简单的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)

在这里,我们分别为三个孩子提供root1root2

要获得root1的孩子,我会发出以下问题:

MATCH (r:ROOT)-[:HAS_CHILD]->c where r.name='root1' RETURN collect(c)

现在我知道了根root1的孩子。 问题是:查询如何查询root1root2的子项,其结果将显示哪个子项属于哪个根的关联。因为查询清楚

MATCH (r:ROOT)-[:HAS_CHILD]->c where r.name='root1' OR r.name='root2' RETURN collect(c.id)

会给我两个孩子的根源。但现在我不知道哪个孩子有哪个根。那我该怎么办?

1 个答案:

答案 0 :(得分:0)

您应该向我们提供更多详细信息,但是这样的查询(调整属性和关系)应该可以按照您的需要运行:

MATCH (child) <-[:HAS_CHILD]- (root:ROOT)
WHERE root.name IN ['root1','root4']
RETURN child, root