performance - 如何通过多个匹配和增加 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 的新手,每一个建议都非常受欢迎。
解决方案
假设您在数组中提供 :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
检索餐馆及其食物。
推荐阅读
- php - 如何将项目复制到现有数组
- django - Nginx 无法通过 gunicorn 代理 django 应用程序
- tomcat - 没有请求正文发送时,Tomcat 仍然发送“Continue 100”。像401未经认证的情况
- php - PHP 7+ 中的命名参数解决方案
- git - Git Credential Manager - 启用代理时不加载
- c++ - std::string .erase() 没有重载函数的实例
- sql-server - Golang 无法从主机上的 Sql Server Browser 获取实例
- machine-learning - RandomForestRegressor 模型评估?
- gradle - 推荐使用“tasks.withType(Foo) {...}”或“foo {...}”配置插件的方式?
- android - 我想在 nativescript vue 中打开意图处理程序并获取结果意图数据