代码之家  ›  专栏  ›  技术社区  ›  Ahmad

在Neo4J中是否与id performant匹配?

  •  0
  • Ahmad  · 技术社区  · 6 年前

    我想知道,当我读取了一个节点的数据,并希望在另一个查询中匹配它时,哪种方式的性能最好?使用 id 这样地:

    MATCH (n) WHERE ID(n) = 1234
    

    MATCH (n:Label {SomeIndexProperty: 3456})
    

    1 回复  |  直到 6 年前
        1
  •  1
  •   logisima    6 年前

    IDs 是Neo4j的技术ID,不应将其用作应用程序的主键。

    每个节点(和关系)都有一个技术ID,并且随着时间的推移是稳定的。 但是如果删除一个节点,例如 32 ID 对于新节点。

    因此,您可以在同一事务内的查询中使用它(这没有问题),否则您应该知道自己在做什么。

    这个 只有 检索技术文档的方法 身份证件 就像第一次查询时一样: MATCH (n) WHERE ID(n) = 1234 RETURN n . 这个 不是作为节点的属性公开的,因此 不能 MATCH (n {ID:1234}) RETURN n .

    你已经注意到如果你想 WHERE 在严格相等的条件下,可以直接将条件放在节点上。

    • MATCH (n:Node) WHERE n.name = 'logisima' RETURN n
    • MATCH (n:Node {name:'logisima'}) RETURN n

    这两个查询是相同的,它们生成相同的查询计划,只是一个语法糖。

    按节点的ID或索引属性检索节点更快吗?

    要知道这个问题的答案,更简单的方法是分析这两个查询。

    在一个基于 ,你会看到盒子 NodeByIdSeek 那代价呢 1 db命中 ,在具有唯一约束的一个上,您将看到该框 NodeUniqueIndexSeek 2 db点击

    所以通过它的 身份证件