【问题标题】:Neo4j query execution processNeo4j查询执行流程
【发布时间】: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 没有任何改变。

标签: neo4j cypher


【解决方案1】:

它需要首先从源节点开始按类型和方向跟踪关系。

所以它按类型和方向扩展 然后才看到结束节点,然后可以过滤那些具有匹配标签的节点。

如果您的关系已经唯一标识目标节点标签,那么您可以从这些标签中删除标签(但不是从起始节点中删除,否则它不会使用索引)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-11-04
    • 1970-01-01
    • 2019-03-02
    相关资源
    最近更新 更多