Neo4j - 关系中数组内的数组

时间:2015-09-11 14:12:48

标签: arrays database database-design neo4j

几天以来,我一直在设计一个社交网络数据库结构,我一直在优化数据结构。

我想在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时间没有交友,等等。)

提前谢谢。

1 个答案:

答案 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节点延伸的“链表”中。