让我们假设这个用例;我们有几个节点(标记为Big),每个节点都有一个简单的整数ID属性。每个大节点与数百万个(标记为小的)节点有关系。例如:
(小)-:属于->(大)
如何用自然语言表达Cypher查询,以表示以下内容:
对于it范围在4-7之间的每个Big节点,请给我10个属于它的小节点。
假设结果将给出2个大节点,20个小节点和20个关系
所需的结果将由以下图表表示:
我尝试过但失败的内容(它只显示了一个大节点(id=5)及其10个相关的小节点,但没有显示第二个节点(id=6):
MATCH (s:Small)-[:BELONGS_TO]->(b:Big)
Where 4<b.bigID<7
return b,s limit 10我想我需要一个更复杂的复合查询。
希望我能用一种可以理解的方式表达我的问题!
发布于 2017-03-22 13:34:36
您的查询不起作用,因为限制适用于整个前一个流。
您需要使用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发布于 2017-03-22 17:35:04
正如stdob所说,您不能在这里使用极限,至少不能以这种方式使用,因为它限制了整个结果集。
虽然聚合解决方案将为您返回正确的答案,但您仍将为扩展到这数百万节点付出代价。你需要一个解决方案,懒洋洋地为每个人得到前十名。
使用APOC过程,可以使用apoc.cypher.run()有效地执行子查询。该查询将按行运行,因此如果首先限制行,则可以调用它并在子查询中使用LIMIT,它将正确地将每一行的结果限制为10个,这样就不会为扩展到数百万个节点支付费用。
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.shttps://stackoverflow.com/questions/42950621
复制相似问题