【问题标题】:CREATE UNIQUE with labels and properties使用标签和属性创建唯一
【发布时间】:2013-11-15 14:16:41
【问题描述】:

我正在使用 Neo4j 2.0.0-M06。只是学习 Cypher 并阅读文档。在我看来,这个查询会起作用,但我应该很幸运......

我正在将推文导入 mysql 数据库,然后从那里将它们导入 neo4j。如果一条推文已经存在于 Neo4j 数据库中,则应该更新它。

我的查询:

MATCH (y:Tweet:Socialmedia) WHERE
HAS (y.tweet_id) AND y.tweet_id = '123'
CREATE UNIQUE (n:Tweet:Socialmedia {
 body : 'This is a tweet', tweet_id : '123', tweet_userid : '321', tweet_username : 'example'
} )

Neo4j 说:This pattern is not supported for CREATE UNIQUE

数据库当前在具有匹配标签的节点上为空,因此在 Neo4j 数据库中没有任何推文。

什么是正确的查询?

【问题讨论】:

  • 我是否正确理解 Neo4j 仅在创建关系时才允许在单个节点上 CREATE UNIQUE?
  • 很快,MERGE 将在所有情况下替换 CREATE UNIQUE。 :) CREATE UNIQUE 目前是建立唯一关系的唯一方法,但绝对对节点使用 MERGE。

标签: neo4j cypher


【解决方案1】:

您想对该查询使用 MERGE 以及唯一约束。

CREATE CONSTRAINT on (t:Tweet) ASSERT t.tweet_id IS UNIQUE;

MERGE (t:Tweet {tweet_id:'123'})
ON CREATE
SET t:SocialMedia, 
    t.body = 'This is a tweet', 
    t.tweet_userid = '321', 
    t.tweet_username = 'example';

这将使用索引按 id 查找推文,如果推文存在则不执行任何操作,否则将设置这些属性。

【讨论】:

  • 很好的答案!也帮助了我。
【解决方案2】:

我想指出一个可以使用

的组合
  1. 创建约束,然后是正常的
  2. 创建(不带 UNIQUE)

这适用于期望一个唯一节点并希望在该节点意外存在时抛出异常的情况。 (比在创建节点之前寻找节点便宜得多)。

还要注意,MERGE 似乎比 CREATE 占用更多的 CPU 周期。 (即使抛出异常也需要更多的 CPU 周期)

涵盖 CREATE CONSTRAINT、CREATE 和 MERGE 的替代方案(尽管不可否认,这不是本文的主要目的)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 2015-10-03
    • 1970-01-01
    相关资源
    最近更新 更多