我有图表:(: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
但是,此解决方案无法扩展,因为它仍会遍历每家公司的所有产品。每个公司产品收集后应用切片。随着产品数量的增长,查询性能将下降。
答案 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