Neo4j / Cypher匹配遍历分支中的前n个节点

时间:2016-05-03 14:55:27

标签: neo4j cypher graph-databases nosql

我有图表:(:Sector)<-[:BELONGS_TO]-(:Company)-[:PRODUCE]->(:Product)

我正在寻找下面的查询。

(:Sector)开始。然后匹配该行业的前50家公司,并为每家公司匹配前10个产品。

第一个限制很简单。但是限制产品呢。

cypher有可能吗?

更新

正如@cybersam建议下面的查询将返回有效结果

MATCH (s:Sector)<-[:BELONGS_TO]-(c:Company)
WITH c
LIMIT 50
MATCH (c)-[:PRODUCE]->(p:Product)
WITH c, (COLLECT(p))[0..10] AS products
RETURN c, products

但是,此解决方案无法扩展,因为它仍会遍历每家公司的所有产品。每个公司产品收集后应用切片。随着产品数量的增长,查询性能将下降。

2 个答案:

答案 0 :(得分:1)

此查询的每个返回行将包含:一个扇区,一个公司(每个扇区最多50个),以及该公司最多10个产品的集合:

MATCH (s:Sector)<-[:BELONGS_TO]-(c:Company)
WITH s, (COLLECT(c))[0..50] AS companies
UNWIND companies AS company
MATCH (company)-[:PRODUCE]->(p:Product)
WITH s, company, (COLLECT(p))[0..10] AS products;

答案 1 :(得分:1)

使用APOC Procedures更新某些解决方案。

这篇关于limiting results per row的Neo4j知识库文章介绍了一些不同的方法。

一种方法是使用apoc.cypher.run()每行执行一个有限的子查询。应用于相关查询,这将起作用:

MATCH (s:Sector)<-[:BELONGS_TO]-(c:Company)
WITH c
LIMIT 50
CALL apoc.cypher.run('MATCH (c)-[:PRODUCE]->(p:Product) WITH p LIMIT 10 RETURN collect(p) as products', {c:c}) YIELD value
RETURN c, value.products AS products

提到的另一个替代方案是使用APOC路径扩展器程序,在终端过滤器上提供标签和限制:

MATCH (s:Sector)<-[:BELONGS_TO]-(c:Company)
WITH c
LIMIT 50
CALL apoc.path.subgraphNodes(c, {maxLevel:1, relationshipFilter:'PRODUCE>', labelFilter:'/Product', limit:10}) YIELD node
RETURN c, collect(node) AS products