我刚刚进入Graph数据库并需要建议。Neo4j使用关系中的属性建模建议
对于这个例子,我有一个'Person'节点和一个'Project'节点,两者之间有两个关系。这两个关系:
- 指定日期,这是预计完成日期
- 一名通过验证的日期,这是实际完成日期
无论是从人到项目中。
具体指使用关系属性来保存事件的“日期值”。他们有什么缺点,或者更好的方式在图表中进行建模?
我刚刚进入Graph数据库并需要建议。Neo4j使用关系中的属性建模建议
对于这个例子,我有一个'Person'节点和一个'Project'节点,两者之间有两个关系。这两个关系:
无论是从人到项目中。
具体指使用关系属性来保存事件的“日期值”。他们有什么缺点,或者更好的方式在图表中进行建模?
这是比较容易保持在Unix纪元时间戳(存储为长整数)形式的日期,而不是作为儒略历日期。 Neo4j没有内置的日期/时间格式。
时间戳,可用于在日期上执行计算,以查找诸如计划后的多少天是基于当前日期的项目。
Cypher中的timestamp()函数提供了一种获取neo4j中当前Unix时间的方法。
Neo4J中的每个关系在内部占用34字节的数据,不包括关系的实际内容。将计划完成和验证完成都作为单一关系中的属性而不是将它们存储为两个关系可能更有效。
关系不需要同时具有预定日期和验证日期(NoSQL的优点)。您可以稍后使用SET关键字添加验证日期。
只是给你一个例子。
使用以下Cypher语句创建。
Create (p:Person {name:'Bill'})-[r:Works_On {scheduledcompletion: 1461801600}]->(pro:Project {name:'Jabberwakie'})
使用以下Cypher语句将验证日期设置为当前时间。
Match (p:Person {name:'Bill'})-[r:Works_On]->(pro:Project {name:'Jabberwakie'}) set r.verifiedcompletion=timestamp()
使用下面的Cypher语句来执行某种计算的,在这种情况下返回一个布尔值,如果项目进度落后与否。
Match (p:Person {name:'Bill'})-[r:Works_On]->(pro:Project {name:'Jabberwakie'}) return case when r.scheduledcompletion > r.verifiedcompletion then true else false end as behindschedule
想想也是的情况下,预计存储完成日期与实际日期成品在节点项目,如果这个属性关系到整个项目,是关系到它所有的人一样。
这将帮助您避免重复数据,并且使查询项目的属性工作更快,因为您无需查找关系。如果你的模型被设计为具有不同的实际日期和完成不同的人,除了在关系中存储数据集,在整个项目中存储项目节点组合信息仍然是有意义的。因为它会使模型更清晰,并且更快地执行某些查询。
对不起,我没有给出完整的解释,但是这个模型会有几个人执行同一个项目,每个人都有自己的预定和验证日期。这就是为什么我试图把数据放在关系中。这就是说你会以不同的方式做到这一点? –
我真的很感谢彻底的解释,谢谢。也会研究你也建议的日期格式。 –
不客气。我希望它可以帮助:) – Anomaly211