Neo4j - 关系内的数组内的数组
Posted
技术标签:
【中文标题】Neo4j - 关系内的数组内的数组【英文标题】:Neo4j - Array inside an array inside a relationship 【发布时间】:2015-09-11 14:12:47 【问题描述】:这几天,我一直在设计一个社交网络数据库结构,并一遍又一遍地优化数据结构。
我想在 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 时间,x 时间的接收者非好友发件人等)。
提前谢谢你。
【问题讨论】:
你能澄清你的问题吗? 当然,抱歉,如果我不够明确。我的问题是如何创建一个关系,它的属性包含多维数组(历史,我将在其中保存此属性的早期版本)和另一个属性 - 单级数组,包含当前的友谊状态和时间戳。跨度> Neo4j 中的数组是一维的,它们只是值的序列。解决方案是将您的模型分布在更多节点上(请参阅我的答案以获取示例)。 我的评论不清楚,我的意思是数组是值的序列,唯一的索引是该序列——数组中不能有键/值对或命名值。但是,您可以在数组中拥有数组,因此您当然可以以这种方式拥有多维数组。这是你想做的吗? 【参考方案1】:要将值添加到关系r
上的数组(集合)属性arr
,您可以这样做
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
节点与两个:User
节点有[:MEMBER]
关系。然后将友谊状态保留为该节点上的属性。对关系历史建模的一个好方法是为每个更新创建一个节点,并将这些节点保存在从:Friendship
节点扩展的“链接列表”中。
【讨论】:
以上是关于Neo4j - 关系内的数组内的数组的主要内容,如果未能解决你的问题,请参考以下文章