【发布时间】:2023-02-05 00:50:20
【问题描述】:
我正在使用 Neo4j 5.1 企业版。
我执行了以下代码:
profile MATCH(d:Dataset {name:'dataset2'})<-[:`has_d`]-(s:Score)-[:`has_a`]->(a:Algorithm {name:'algorithm1'})
MATCH (t:Tag) WHERE t.name IN ['tag1', 'tag2', 'tag3', 'tag4', 'tag5']`
MATCH (i:Image)-[:has_score]->(s)-[:`has_tag`]->(t)
RETURN i LIMIT 100
我期待它在执行展开之前按名称过滤标签。
为什么 Neo4j 在 Filter 之前展开?
我该如何解决?执行顺序无关紧要吗?
Filter@Neo4j 是一个简单的过滤器还是使用我们的索引?
我很抱歉问了这么多问题,也许其中一些问题是愚蠢和明显的,但我不明白为什么。
任何帮助将不胜感激
【问题讨论】:
-
使用这个,你会看到它会先获取 s 和 t; profile MATCH(d:Dataset {name:'dataset2'})<-[:
has_d]-(s:Score)-[:has_a]->(a:Algorithm {name:'algorithm1'}) 匹配(t:Tag) WHERE t.name IN ['tag1', 'tag2', 'tag3', 'tag4', 'tag5']` WITH s, t MATCH (i:Image)-[:has_score]->( s)-[:has_tag]->(t) 返回 i 限制 100 -
您正在运行 3 个不带 WITH 子句的 MATCH 语句,因此它正在自己做笛卡尔积
-
@jose_bacoy 感谢您的回答。您的代码的配置文件结果与我的完全相同。所以,Neo4j 会先展开再过滤。 WITH 没有任何改变。