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 - 关系内的数组内的数组的主要内容,如果未能解决你的问题,请参考以下文章

尝试放松并在节点之间建立新的关系Neo4J C#Client

Javascript 关系数据库

Neo4J 和 Spring 返回空关系

深度解析PHP数组函数array_chunk

如何解析 JSON 数据对象内的数组内的数组?

如何更新猫鼬模式中另一个数组内的数组内的对象?