如何在neo4j中使用MERGE(或其他内容)根据其他关系中标签中的信息创建新节点和关系
所以,基本上,我试图在网络中创建关系,基于其他关系中的信息。我添加了一个示例来演示我想要实现的目标 在本例中,我跟踪拥有twitter帐户的用户。有两种类型的节点:如何在neo4j中使用MERGE(或其他内容)根据其他关系中标签中的信息创建新节点和关系,neo4j,cypher,Neo4j,Cypher,所以,基本上,我试图在网络中创建关系,基于其他关系中的信息。我添加了一个示例来演示我想要实现的目标 在本例中,我跟踪拥有twitter帐户的用户。有两种类型的节点: User包含标签User\u id(以及其他一些东西),通常与twitter id无关 Social表示社交网络(例如,如果name标签为“Twitter”,则为Twitter) 除此之外,还有两种类型的关系: ACCOUNT将用户连接到社交以表示某人是否拥有帐户,此关系还具有标签名称,以表示该社交网络上的特定ID或名称 FOLLO
User
包含标签User\u id
(以及其他一些东西),通常与twitter id无关Social
表示社交网络(例如,如果name
标签为“Twitter”,则为Twitter)ACCOUNT
将用户
连接到社交
以表示某人是否拥有帐户,此关系还具有标签名称
,以表示该社交网络上的特定ID或名称FOLLOWS
,它可以将一个用户(u1
)连接到另一个用户(u2
),如果u1
跟随u2
)
user_id
1到3,他们都有一个Twitter帐户,包括特定的Twitter 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 id的人1111
跟随另一个拥有twitter id的人5555
那么必须发生什么:
5555
的帐户。如果没有,那么创建一个新的,设置Twitter关系并在节点上设置user\u id
标签FOLLOWS
关系以指示1111
在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)
但这并没有真正起作用。我意识到我正在匹配用户id
,而我应该只匹配关系中的twitter帐户名
最近的尝试如下所示:
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
添加了一个新节点(尽管没有用户id atm),但它也创建了一个新的社交
节点。我从解释的内容中了解到了原因,但是他们假设实际节点上有一个标签要匹配
那么正确的方法是什么呢?理想情况下,我可以始终使用相同的语句。例如,在添加
1111
在5555
之后的事实之后,我还可以添加2222
在5555
之后,而不创建任何不必要的新节点。您需要对这些属性设置唯一约束
e、 g
您需要对这些属性设置唯一约束 e、 g
我认为您的图形模型存在问题,这就是您面临实际问题的原因 让我解释一下你的模型的问题 你如何判断用户a是否喜欢facebook上的用户b?您无法创建指向其他关系的关系,如果您指向用户,则必须指定用户喜欢的社交帐户(在关系中添加属性) 如何创建更好的图形模型? 事实上,我认为您的错误在于将帐户存储为关系,必须将其存储为节点 以下是您案例中良好图形模型的基本图形: 使用这样的模型,可以让一个用户与多个帐户相关,并且喜欢其他用户的帐户(如果需要,可以使用timestamp()方法在
like
关系中添加timestamp属性)
此外,您还可以添加有关帐户的更多信息(twitter个人资料描述、facebook横幅uri等)。我认为您的图形模型存在问题,这就是您面临实际问题的原因 让我解释一下你的模型的问题 你如何判断用户a是否喜欢facebook上的用户b?您无法创建指向其他关系的关系,如果您指向用户,则必须指定用户喜欢的社交帐户(在关系中添加属性) 如何创建更好的图形模型? 事实上,我认为您的错误在于将帐户存储为关系,必须将其存储为节点 以下是您案例中良好图形模型的基本图形: 使用这样的模型,可以让一个用户与多个帐户相关,并且喜欢其他用户的帐户(如果需要,可以使用timestamp()方法在
like
关系中添加timestamp属性)
此外,您还可以添加有关帐户的更多信息(twitter个人资料描述、facebook横幅uri等)这很有意义,谢谢。这是我第一次与neo4j合作,所以我仍然需要对它保持清醒的头脑。最终还会有其他社交网站,不仅是Twitter,还有Facebook和Instagram等。这些帐户节点是否应该独立于实际的社交网络,因此只包含帐户名称并使用特定的社交网络名称连接到社交节点,还是应该使用表示实际社交网络并包含用户名的节点?或者我应该把它放在一个单独的问题中。只需创建一个新的帐户节点,将其链接到您的用户和社交网络(通常是您的facebook帐户的facebook社交节点)。如果你需要更多的帮助,我可以开一个聊天室来讨论。我会很感激的。因为现在我也不能完全确定图表的其他部分的结构。这是有意义的,谢谢。这是我第一次与neo4j合作,所以我仍然需要对它保持清醒的头脑。最终也会有其他社交网站,所以不仅是推特,还有艾尔
CREATE CONSTRAINT ON (user:User) ASSERT user.user_id IS UNIQUE