Neo4j Cypher查询以获取不同节点标签的子集,并带有关系

Neo4j Cypher查询以获取不同节点标签的子集,并带有关系,neo4j,cypher,Neo4j,Cypher,让我们假设这个用例; 我们有几个节点(标记为Big),每个节点都有一个简单的整数ID属性。 每个大节点都与数百万个(标记为小的)节点相关。 例如: (小)-[:属于]->(大) 如何用自然语言表达密码查询以表示以下内容: 对于ID范围在4-7之间的每个大节点,给我10个属于它的小节点 假设结果将给出2个大节点、20个小节点和20个关系 所需结果将由以下图表表示: 我尝试过但失败的内容(仅显示1个大节点(id=5)及其10个相关小节点,但未显示第二个节点(id=6): 匹配(s:Small)-[

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

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

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

对于ID范围在4-7之间的每个大节点,给我10个属于它的小节点

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

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

我尝试过但失败的内容(仅显示1个大节点(id=5)及其10个相关小节点,但未显示第二个节点(id=6):

匹配(s:Small)-[:属于]->(b:Big)

其中4您的查询不起作用,因为该限制适用于之前的整个流

您需要使用:

MATCH(s:Small)-[:belishing_TO]->(b:Big)其中4作为stdob--表示,这里不能使用limit,至少不能这样,因为它限制了整个结果集

虽然聚合解决方案将返回正确的答案,但您仍然需要支付扩展到数百万个节点的成本。您需要一个解决方案,该解决方案将惰性地获得每个节点的前十个节点

使用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
匹配(b:大)
其中4(b)
返回限制为10',
{b:b})屈服值
返回b,值为.s

查询执行出现错误:“没有为此数据库实例注册名为
apoc.cypher.run
的过程。请确保过程名称拼写正确,并且该过程已正确部署。”。请注意,我使用的是neo4j ce 3.1.1。您需要安装。3.1.0.4版是目前服务于neo4j 3.1.1的最新版本。以下是所有可用过程和函数的详细信息。执行结果只有1个大节点和10个小节点。显示具有此行为的数据示例。我的问题是,我测试的数据模型不同您的查询@stdob--结果符合要求!
MATCH (s:Small)-[:BELONGS_TO]->(b:Big) Where 4<b.bigID<7
With b, 
     collect(distinct s)[..10] as smalls
return b, 
       smalls
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