2017-03-22 66 views
1

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

(小) - [:belongs_to的] - >(大)

我如何短语的Cypher查询来表示自然语言如下:

For each Big node in the range of ids between 4-7, get me 10 of Small nodes that belongs to it.

假想的结果将得到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

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

您需要使用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 
+0

执行结果只有1个大节点以及10个小节点。 – assem

+0

显示此行为的数据示例。 –

+0

我的不好,是我测试查询的不同数据模型。您的查询@ stdob--结果按需要! – assem

1

由于stdob--说,你不能在这里使用的限制,至少不能以这种方式,因为它限制了整个结果集。

尽管聚合解决方案将返回正确的答案,但您仍然需要支付为数百万个节点进行扩展的成本。你需要一个解决方案,每个解决方案都会懒惰地获得前10个。

使用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.s 
+0

查询执行出现错误: “没有为此数据库实例注册名为”apoc.cypher.run“的过程,请确保您正确拼写了过程名称,并且过程已正确部署。 。 请注意,我正在使用neo4j ce 3.1.1 – assem

+0

您需要安装[APOC程序插件](https://github.com/neo4j-contrib/neo4j-apoc-procedures/releases)。版本3.1.0.4是目前服务于Neo4j 3.1.1的最新版本。以下是可用的所有程序和功能的[文档](https://neo4j-contrib.github.io/neo4j-apoc-procedures/)。 – InverseFalcon

相关问题