首页 > 解决方案 > 如何通过多个匹配和增加 where 子句的数量来优化和改进 neo4j 密码查询

问题描述

在我的 neo4j 图形数据库中,我有一些与菜单上列出的食物相关联的餐厅,也与它们所在的城市相关联。

我正在尝试寻找伦敦的餐厅,每家都提供不同种类的食物,所以我开始以这种方式寻找两家不同的餐厅:

MATCH (f1:Food)--(r1:Restaurant)-[:LOCATED_IN]-(c1:City{name:'London'}) 
WHERE f1.name in [name1, name2, name3, name4] 
MATCH (f2:Food)--(r2:Restaurant)-[:LOCATED_IN]-(c2:City{name:'London'}) 
WHERE r1.id<>r2.id and f1.name<>f2.name 
RETURN, r1.name as Restaurant_A, collect(distinct f1.name) as Food_A,r2.name as Restaurant_B, collect(distinct f2.name) as Food_B 
LIMIT 1

但是如果我想找到第三家餐厅,我需要添加更多的 where 子句等等,如果我想要第四家餐厅,第五家……</p>

这是第三家餐厅的例子:

MATCH (f1:Food)--(r1:Restaurant)-[:LOCATED_IN]-(c1:City{name:'London'}) 
WHERE f1.name in [name1, name2, name3, name4] 
MATCH (f2:Food)--(r2:Restaurant)-[:LOCATED_IN]-(c2:City{name:'London'}) 
WHERE r1.id<>r2.id and f1.name<>f2.name  
MATCH (f3:Food)--(r3:Restaurant)-[:LOCATED_IN]-(c3:City{name:'London'}) 
WHERE r2.id<>r1.id and r3.id<>r2.id and f3.name<>f3.name  and f3.name<>f2.name  
RETURN r1.name as Restaurant_A, collect(distinct f1.name) as Food_A,r2.name as Restaurant_B, collect(distinct f2.name) as Food_B, r3.name as Restaurant_C, collect(distinct f3.name) as Food_C 
LIMIT 1

我真的很想知道是否有其他方法可以做到这一点,我是 neo4j 的新手,每一个建议都非常受欢迎。

标签: performancegraphneo4jcypherquery-optimization

解决方案


假设您在数组中提供 :Food 节点的集合,您可以这样做

MATCH (f:Food)--(r:Restaurant)-[:LOCATED_IN]-(c1:City{name:'London'}) 
WHERE f IN $foodNodes
RETURN r.name as restaurant, COLLECT(DISTINCT f.name) AS foods

检索餐馆及其食物。


推荐阅读