几天来,我一直在设计一个社交网络数据库结构,并不断优化数据结构。
我想在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时间取消了发送者的好友请求,等等)。
提前谢谢你。
最佳答案
要在关系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
节点扩展的“链表”中。