【问题标题】:Neo4j Cypher Unique Constrain vs IndexingNeo4j Cypher 唯一约束与索引
【发布时间】:2014-01-20 20:32:03
【问题描述】:

我正在创建具有属性名称和 ID 的节点城市。城市节点可以在 ID 上建立索引。我想要唯一的节点。

现在在填充数据库时,我想获取 City 节点(如果存在),否则我想创建一个 City 节点。

最好的方法是什么?

创建一个 Cypher 执行引擎和一个唯一约束。然后使用 MERGE 创建一个唯一节点。

或者类似的东西

Check if the City with that id is present **Match 
START n=node:City(id = { id }) RETURN n**

if n==null Create the Node

哪个快?如果我不索引城市怎么办?

【问题讨论】:

    标签: neo4j


    【解决方案1】:

    Cypher 使用正确的锁是安全的。

    Java 版本可能会快一点,但您必须自己在单个根锁实体上创建写锁,以确保在任何情况下都不会有多个线程访问该代码/数据。

    如果没有索引,您必须扫描整个数据库以检查重复项。

    【讨论】:

    • 假设我对 ids 进行了索引。那么哪种方法更好?第一还是第二?
    【解决方案2】:

    使用http://docs.neo4j.org/chunked/stable/query-merge.html中的信息

    MERGE (aCity:CITY {Id: '1', Name: 'aName') return aCity;
    

    这只会在节点不存在时创建节点。如果节点已经存在,则返回现有节点。

    注意 - 如果名称拼写不同,即使 Id 与现有节点相同,也会创建一个新节点(执行所有字段的完全匹配)。如果这不是您想要的功能,您需要使用上述链接中描述的ON MATCH 功能并对 Id 设置唯一约束

    【讨论】:

    • 但是搜索匹配的节点似乎需要很多时间?如果我将拥有一个大型数据库,这是一个好方法吗?
    • 通常带有标签会有自动索引,所以它会立即找到节点。如果你想更具体一些,你可以执行'create index on :CITY(Id)'。这将确保使用 Id 字段来查找节点。
    猜你喜欢
    • 2015-12-29
    • 2011-03-18
    • 1970-01-01
    • 2014-06-25
    • 1970-01-01
    • 2014-07-18
    • 2021-11-02
    • 2011-11-23
    相关资源
    最近更新 更多