首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >获得具有关系的不同节点标签子集的Cypher查询

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

Stack Overflow用户
提问于 2017-03-22 11:41:10
回答 2查看 407关注 0票数 1

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

(小)-:属于->(大)

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

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

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

所需的结果将由以下图表表示:

2个大节点,每个节点都有10个属于它们的小节点的子集

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

代码语言:javascript
复制
MATCH (s:Small)-[:BELONGS_TO]->(b:Big)
Where 4<b.bigID<7
return b,s limit 10

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

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

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-22 13:34:36

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

您需要使用aggregation function collect

代码语言:javascript
复制
MATCH (s:Small)-[:BELONGS_TO]->(b:Big) Where 4<b.bigID<7
With b, 
     collect(distinct s)[..10] as smalls
return b, 
       smalls
票数 0
EN

Stack Overflow用户

发布于 2017-03-22 17:35:04

正如stdob所说,您不能在这里使用极限,至少不能以这种方式使用,因为它限制了整个结果集。

虽然聚合解决方案将为您返回正确的答案,但您仍将为扩展到这数百万节点付出代价。你需要一个解决方案,懒洋洋地为每个人得到前十名。

使用APOC过程,可以使用apoc.cypher.run()有效地执行子查询。该查询将按行运行,因此如果首先限制行,则可以调用它并在子查询中使用LIMIT,它将正确地将每一行的结果限制为10个,这样就不会为扩展到数百万个节点支付费用。

代码语言:javascript
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42950621

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档