几天以来,我一直在设计一个社交网络数据库结构,我一直在优化数据结构。
我想在Neo4j中实现的目标:
我正在尝试在两个节点之间创建一个关系,它具有一个名为“ history ”的属性,另一个名为“ currentStatus ”。问题是两者都是(应该是)数组。类似的东西:
MATCH (u:User {username: 'john.snow@gmail.com'}), (uu:User {username: 'sansa.stark@gmail.com'})
MERGE u-[rel:FRIENDSHIP]->uu
ON CREATE SET rel.previousFriendshipUpdates = [], rel.currentFriendshipStatus = [sentTime: timestamp(), status: '0']
ON MATCH SET rel.previousFriendshipUpdates = [rel.previousFriendshipUpdates + rel.currentFriendshipStatus], rel.currentFriendshipStatus = [sentTime: timestamp(), status: '1']
我想保留关于他们发生友谊的任何行动的历史记录(发送者在x时间发送了朋友请求,接收者在x时间拒绝了朋友请求,发送者在x时间发送了朋友请求(再次),接收者接受了x时间,接收者在x时间没有交友,等等。)
提前谢谢。
答案 0 :(得分:4)
要在关系arr
上为数组(集合)属性r
添加值,您可以
SET r.arr = r.arr + 'newvalue'
或
SET r.arr = r.arr + ['onevalue', 'nothervalue']
(见How to push values to property array Cypher-Neo4j)
但是数组不能包含sentTime: timestamp()
之类的值。这看起来像属性,数组不能有属性。
节点可以具有属性,但是示例查询的结构和模型的描述都表明您将友谊表示为节点。让每个:Friendship
节点与两个[:MEMBER]
节点具有:User
个关系。然后将友谊状态保留为该节点上的属性。建模关系历史记录的一种好方法是为每个更新创建一个节点,并将它们保存在从:Friendship
节点延伸的“链表”中。