gpt4 book ai didi

neo4j - Cypher - 查询优化

转载 作者:行者123 更新时间:2023-12-04 18:58:34 28 4
gpt4 key购买 nike

我的问题是为什么WHERE运算符(operator)的工作速度没有预期的那么快?
考虑我有 7 个节点,标签为 Consumer .这是一些示例数据...

MERGE (c:Consumer {mobileNumber: "000000000000"})
MERGE (:Consumer {mobileNumber: "111111111111"})
MERGE (:Consumer {mobileNumber: "222222222222"})
MERGE (:Consumer {mobileNumber: "333333333333"})
MERGE (:Consumer {mobileNumber: "444444444444"})
MERGE (:Consumer {mobileNumber: "555555555555"})
MERGE (:Consumer {mobileNumber: "666666666666"})
WITH c
MATCH (c1:Consumer) WHERE c1.mobileNumber <> "000000000000"
MERGE (c)-[:HAS_CONTACT]->(c1)

还有一个 HAS_CONTACT之间的关系 :Consumer(mobileNumber:{"000000000000"})以及所有其他 6 个节点。还有一个 unique indexmobileNumber 的约束 field 。现在,当我尝试执行以下查询时:
    PROFILE MATCH (n:Consumer{mobileNumber : "000000000000"}),
(m:Consumer{mobileNumber : "111111111111"})
WITH n,m
MATCH path = SHORTESTPATH((n)-[contacts:HAS_CONTACT]-(m))
RETURN contacts;

所以它按预期工作正常(基于唯一索引搜索节点)。下面是它的结果:
Without Where clause

现在让我们使用 WHERE 更改上面的查询条款:
PROFILE MATCH (n:Consumer{mobileNumber : "000000000000"}),
(m:Consumer) WHERE m.mobileNumber
IN (["111111111111"])
WITH n,m
MATCH path = SHORTESTPATH((n)-[contacts:HAS_CONTACT]-(m))
RETURN contacts;

查询结果:
With WHERE clause

现在虽然上面的查询工作正常,并给出与旧查询相同的结果。但是对于我使用过的 endNode WHERE子句,它不使用任何索引。它首先搜索所有存在的节点,然后使用 WHERE 过滤结果。子句,如果有数十万个具有相同标签的节点,这可能太昂贵了。

所以我的问题是:
  • 为什么当我使用 WHERE 时它不使用索引条款?
  • 引用数据库命中次数较少的多个节点的最佳方法是什么?
  • 我可以用IN操作符同时期待索引搜索?
  • 最佳答案

    正如@DaveBennett 所说,这个问题在 3.2.2 版本中似乎不存在。

    如果您使用的是以前的版本,请尝试提供 hints告诉规划者它应该使用索引:

    PROFILE MATCH
    (n:Consumer{mobileNumber : "000000000000"}),
    (m:Consumer)
    USING INDEX n:Consumer(mobileNumber)
    USING INDEX m:Consumer(mobileNumber)
    WHERE m.mobileNumber IN (["111111111111"])
    MATCH path = SHORTESTPATH((n)-[contacts:HAS_CONTACT]-(m))
    RETURN contacts;

    这也可能有效,因为一些计划者似乎会自动尝试在(仅)第一个 MATCH 上使用索引。学期:
    PROFILE MATCH
    (n:Consumer{mobileNumber : "000000000000"}),
    (m:Consumer)
    USING INDEX m:Consumer(mobileNumber)
    WHERE m.mobileNumber IN (["111111111111"])
    MATCH path = SHORTESTPATH((n)-[contacts:HAS_CONTACT]-(m))
    RETURN contacts;

    关于neo4j - Cypher - 查询优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45274319/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com