使用标签和属性创建独特的

时间:2013-11-15 14:16:42

标签: neo4j cypher

我正在使用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数据库中没有推文。

什么是正确的查询?

2 个答案:

答案 0 :(得分:6)

您希望将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查找推文,如果推文存在则不执行任何操作,否则将设置这些属性。

答案 1 :(得分:0)

我想指出一个可以使用

的组合
  1. 创建约束,然后是正常的
  2. 创建(没有独特)
  3. 这适用于需要一个唯一节点并希望在节点意外存在时抛出异常的情况。 (比在创建节点之前查找节点便宜得多。)

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

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

相关问题