所以基本上我正在尝试根据其他关系中的信息在网络中创建关系。我添加了一个例子来展示我想要实现的目标。
在此示例中,我正在跟踪拥有Twitter帐户的用户。有两种类型的节点:
User
包含标签user_id
(以及其他一些内容),通常与twitter id无关Social
代表一个社交网络(例如Twitter,如果name
标签是'twitter')。最重要的是,有两种类型的关系:
ACCOUNT
将User
连接到Social
以表示某人是否拥有帐户,此关系还具有标签name
来表示该社交中的特定ID或名称网络FOLLOWS
如果User
跟u1
User
,可以将u2
(u1
)与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上。以下三行创建了三个用户1111
1到3,他们都拥有Twitter帐户,包括特定的Twitter ID。
5555
所以现在我有了一条新的信息:推特标识为1111
的人跟随另一个推文标识为5555
的人。
所以必须发生的事情:
user_id
的Twitter连接的用户(此文件始终存在)FOLLOWS
。如果没有,则创建一个新的,设置Twitter关系并在节点上设置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)
正在关注user_id
最初我有以下密码声明:
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
而不创建任何不必要的新节点。
答案 0 :(得分:2)
您需要在这些属性上设置UNIQUE约束。
e.g。
CREATE CONSTRAINT ON (user:User) ASSERT user.user_id IS UNIQUE
答案 1 :(得分:2)
我认为您的图表模型存在问题,这就是您遇到实际问题的原因。
如果用户喜欢Facebook上的用户b怎么说?你不能创建指向另一个关系的关系,如果你指向用户,你必须指定用户喜欢哪个社交帐户(在关系中添加一个属性)。
事实上,我认为您的错误是将帐户存储为关系,您必须将其存储为节点。
使用这样的模型,您可以让用户与多个帐户相关,并且喜欢其他用户的帐户(如果需要,可以使用timestamp()方法在LIKE
关系中添加时间戳属性)。
此外,您可以在帐户周围添加更多信息(Twitter个人资料描述,facebook横幅uri等等)