我对“架构”设计有疑问。为简化起见,基本上有2个实体,大学和学生。学生可以是“当前”或“过去”。每个学生都有一个“开始日期”,可能还有一个“结束日期”。现在,我可以建立一种从大学到学生的“当前”或“过去”类型的关系。学生可以在多所大学当前/过去。
我的问题是 - 我如何表示日期?
我可以将日期作为关系的属性(过去或现在),但这不会让人很容易回答,比如说“给我看看2009年开始的所有学生”。通常情况下,我会有一个单独的日期图,但由于我们在Neo4j中没有超边缘,我不确定最佳设计/实践是什么...... 我可以创建一个位于每个关系之间的中间节点(例如'CurrentStudent'),并将其连接到日期图(虚假的超边缘)。还有其他想法吗?
提前致谢...
答案 0 :(得分:2)
我将from
和to
属性放在从学生到大学的studies_at
关系中。 from
和to
的值是自纪元以来的毫秒数(在Java中称为Date.getTime()
)。当前学生由from
表示等于Long.MAX_VALUE。
大学和学生获得了他们名字的标签和索引属性。
从2009年开始查找大学的所有学生:
MATCH (:University {name:'my university'})<-[r:STUDIES_AT}-(student:Student)
WHERE r.from >= {ms_since_epoch_for_Jan 1st 2009}
AND r.from <= {ms.since_epoch_for_Dec_31st 2009}
RETURN student
当然你可以介绍一个时间树。然后studies_at
关系成为一个节点,因为学习的事实现在已成为你模型中的一个东西。 studies_in节点连接到学生,unversity和两次到时间树,具有starts
和ends
关系。
时间树需要根据搜索的粒度规定粒度(日,分,秒)。