Cypher查询获取具有关系的不同节点标签的子集

时间:2017-03-22 11:41:11

标签: neo4j cypher

让我们假设这个用例; 我们有很少的节点(标记为Big),每个节点都有一个简单的整数ID属性。 每个Big节点都与数百万个(标记为Small)节点有关系。 如:

(小) - [:BELONGS_TO] - >(大)

如何使用自然语言表示Cypher查询以表示以下内容:

  

对于4-7之间的id范围内的每个Big节点,给我10个属于它的小节点。

假定的结果将给出2个大节点,20个小节点和20个关系

所需的结果将由此图表表示:

2 Big nodes, each with a subset of 10 of Small nodes that belongs to them

我尝试过但失败了(它只显示了1个大节点(id = 5)及其10个相关的小节点,但没有显示第二个节点(id = 6):

MATCH (s:Small)-[:BELONGS_TO]->(b:Big)
Where 4<b.bigID<7
return b,s limit 10

我想我需要一个更复杂的复合查询。

希望我能以一种可以理解的方式表达我的问题!

2 个答案:

答案 0 :(得分:1)

正如stdob--所说,你不能在这里使用限制,至少不是这样,因为它限制了整个结果集。

虽然聚合解决方案会为您提供正确的答案,但您仍然需要为数百万个节点支付扩展费用。你需要一个解决方案,懒洋洋地获得每个的前10个。

使用APOC过程,您可以使用apoc.cypher.run()来有效地执行子查询。查询将按行运行,因此如果您首先限制行,则可以调用此行并在子查询中使用LIMIT,并且每行将正确限制为10个结果,因此您可以随意扩展; t支付扩展到数百万个节点的费用。

MATCH (b:Big)
WHERE 4 < b.bigID < 7
CALL apoc.cypher.run('
 MATCH (s:Small)-[:BELONGS_TO]->(b)
 RETURN s LIMIT 10', 
 {b:b}) YIELD value
RETURN b, value.s

答案 1 :(得分:0)

您的查询不起作用,因为该限制适用于整个前一个流程。

您需要使用aggregation function collect

MATCH (s:Small)-[:BELONGS_TO]->(b:Big) Where 4<b.bigID<7
With b, 
     collect(distinct s)[..10] as smalls
return b, 
       smalls