如何在neo4j中使用MERGE(或其他东西)根据其他关系中的标签中的信息创建新节点和关系

时间:2015-09-17 11:57:54

标签: neo4j cypher

所以基本上我正在尝试根据其他关系中的信息在网络中创建关系。我添加了一个例子来展示我想要实现的目标。

在此示例中,我正在跟踪拥有Twitter帐户的用户。有两种类型的节点:

  1. User包含标签user_id(以及其他一些内容),通常与twitter id无关
  2. Social代表一个社交网络(例如Twitter,如果name标签是'twitter')。
  3. 最重要的是,有两种类型的关系:

    1. ACCOUNTUser连接到Social以表示某人是否拥有帐户,此关系还具有标签name来表示该社交中的特定ID或名称网络
    2. FOLLOWS如果Useru1 User,可以将u2u1)与u2 user_id联系起来MERGE (u:User {user_id:'1', other_stuff:'...'}) MERGE (s:Social {name:'twitter'}) MERGE (u)-[:ACCOUNT {name:1111}]->(s) MERGE (u:User {user_id:'2', other_stuff:'...'}) MERGE (s:Social {name:'twitter'}) MERGE (u)-[:ACCOUNT {name:2222}]->(s) MERGE (u:User {user_id:'3', other_stuff:'...'}) MERGE (s:Social {name:'twitter'}) MERGE (u)-[:ACCOUNT {name:3333}]->(s) 在Twitter上。
    3. 以下三行创建了三个用户1111 1到3,他们都拥有Twitter帐户,包括特定的Twitter ID。

      5555

      所以现在我有了一条新的信息:推特标识为1111的人跟随另一个推文标识为5555的人。

      所以必须发生的事情:

      1. 找到标识为user_id的Twitter连接的用户(此文件始终存在)
      2. 查看是否有用户连接到Twitter,其帐户ID为FOLLOWS。如果没有,则创建一个新的,设置Twitter关系并在节点上设置1111标签
      3. 设置5555关系以表明// Try to match against existing user node, or create new MERGE (u1:User {user_id:'t5555'}) // Try to match against existing social node, or create new MERGE (s:Social {name:'twitter'}) // Try to match against a user who has a twitter account '1111' MERGE (u2:User)-[:Account {name:1111}]->(s) // Try to add account for new user 5555 MERGE (u1)-[:Account {name:'5555'}]->(s) // Try to find `FOLLOWS` relationship MERGE (u2)-[:FOLLOWS]->(u1) 正在关注user_id
      4. 最初我有以下密码声明:

        MERGE (u1:User)-[:ACCOUNT {name:1111}]->(s1:Social {name:'twitter'})
        MERGE (u2:User)-[:ACCOUNT {name:5555}]->(s2:Social {name:'twitter'})
        MERGE (u1)-[:FOLLOWS]-(u2)
        

        但这并没有真正奏效。我意识到我与u2匹配,而我只应该与关系中的Twitter帐户名匹配。

        最近的尝试如下:

        Social

        这确实为用户1111添加了一个新节点(虽然没有user_id atm),但它也创建了一个新的5555节点。由于解释了here,我有点理解,但是他们假设在实际节点上有一个标签可以匹配。

        那么这样做的正确方法是什么?理想情况下,我总是可以使用相同的语句。例如,在添加2222跟随5555的事实后,我还可以添加DELETE FROM tblmark WHERE NOT EXISTS (SELECT 1 FROM tblstu WHERE tblmark.PK = tblstu.PK) 跟随local而不创建任何不必要的新节点。

2 个答案:

答案 0 :(得分:2)

您需要在这些属性上设置UNIQUE约束。

e.g。

CREATE CONSTRAINT ON (user:User) ASSERT user.user_id IS UNIQUE

http://neo4j.com/docs/stable/query-constraints.html

答案 1 :(得分:2)

我认为您的图表模型存在问题,这就是您遇到实际问题的原因。

让我解释你的模型的问题

如果用户喜欢Facebook上的用户b怎么说?你不能创建指向另一个关系的关系,如果你指向用户,你必须指定用户喜欢哪个社交帐户(在关系中添加一个属性)。

如何创建更好的图模型?

事实上,我认为您的错误是将帐户存储为关系,您必须将其存储为节点。

以下是您案例中良好图表模型的基本图纸: Graph Model

使用这样的模型,您可以让用户与多个帐户相关,并且喜欢其他用户的帐户(如果需要,可以使用timestamp()方法在LIKE关系中添加时间戳属性)。

此外,您可以在帐户周围添加更多信息(Twitter个人资料描述,facebook横幅uri等等)