Neo4j使用关系中的属性建模建议

时间:2016-03-27 22:28:28

标签: neo4j

我刚进入Graph数据库并需要建议。

对于这个例子,我有一个' Person'节点和项目'节点有两个关系。这两种关系是:

  • 预定日期,这是预计完成日期
  • 验证日期,这是实际完成日期

两者都是从人到项目。

具体是指使用关系属性来保存"日期值"这件事。它们是否有任何缺点,或者是在图表中对此进行建模的更好方法?

下面是一个简单的模拟: enter image description here

2 个答案:

答案 0 :(得分:3)

以Unix Epoch时间戳(存储为长整数)的形式保存日期更容易,而不是Julian日期。 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

答案 1 :(得分:0)

如果此属性与整个项目相关并且与所有相关人员相同,请考虑将预计完成日期和实际完成日期存储在节点项目中。

这将帮助您避免重复数据,并且可以使您通过属性查询项目更快,因为您不必查找关系。如果您的模型设计为具有不同的日期实际并为不同的人完成除了在关系中存储数据集之外,仍然有意义的是存储项目节点组合整个项目的信息。因为它会使模型更清晰,一些查询更快执行。