让我们假设这个用例; 我们有很少的节点(标记为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
我想我需要一个更复杂的复合查询。
希望我能以一种可以理解的方式表达我的问题!
答案 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