Neo4j/索引属性与创建不同节点

Neo4j/索引属性与创建不同节点,neo4j,cypher,graph-databases,Neo4j,Cypher,Graph Databases,让我们假设这个用例: 获取2013/05/12 20:00到2013/05/14 21:00之间通过的所有事件 在Neo4j中实现这种情况的第一种方法是对属性进行索引: 事件开始日期:…,结束日期:。。。正在索引的起始和结束 这将导致扫描所有属性与实际查询相对应的事件 我刚才读到的另一种方式: 问题是:在这种情况下,节点遍历在性能方面是否比处理日期的索引属性要好得多?设计时间线树的更好方法,特别是在需要在间隔期间之间进行搜索的情况下: 如果您对查找某个时间间隔之间发生的一系列事件更感兴趣,那么

让我们假设这个用例:

获取2013/05/12 20:00到2013/05/14 21:00之间通过的所有事件

在Neo4j中实现这种情况的第一种方法是对属性进行索引: 事件开始日期:…,结束日期:。。。正在索引的起始和结束

这将导致扫描所有属性与实际查询相对应的事件

我刚才读到的另一种方式:


问题是:在这种情况下,节点遍历在性能方面是否比处理日期的索引属性要好得多?

设计时间线树的更好方法,特别是在需要在间隔期间之间进行搜索的情况下:

如果您对查找某个时间间隔之间发生的一系列事件更感兴趣,那么通过密码遍历来查找正确的事件会更好


Neo4j将节点属性存储为linkedlist。更多信息:如果您浏览neo4j存储体系结构,您将认识到创建独特的关系类型将使您的遍历在性能方面更加出色。

设计时间线树的更好方法,特别是在您希望在时间间隔之间搜索的情况下:

如果您对查找某个时间间隔之间发生的一系列事件更感兴趣,那么通过密码遍历来查找正确的事件会更好

Neo4j将节点属性存储为linkedlist。更多信息:如果您了解neo4j存储体系结构,您将认识到创建独特的relationshiptypes将使您的遍历在性能方面更加出色

在这种情况下,多级日期时间索引中的节点遍历在性能方面是否比处理日期的索引属性要好得多

不,对于这种类型的数据结构,日期的索引属性比遍历性能更好

下面是使用混合方法的详细示例。考虑下面的子图,其中ELIPSES指示图中的连续模式。

请查看获取或创建多级日期时间索引的完整日历密码脚本。此数据结构允许您从一个日期遍历到另一个日期,以获取时间序列的事件范围。将索引属性匹配和遍历结合起来是最好的方法,并且在正确建模时表现良好

例如,考虑下面的密码查询:

// What staff have been on the floor for 80 minutes or more on a specific day?
WITH { day: 18, month: 1, year: 2014 } as dayMap

// The dayMap field acts as a parameter for this script
MATCH (day:Day { day: dayMap.day, month: dayMap.month, year: dayMap.year }),
      (day)-[:FIRST|NEXT*]->(hours:Hour),
      (hours)<-[:BEGINS]-(shift:Event),
      (shift)<-[:WORKED]-(employee:Employee)

WITH shift, employee
ORDER BY shift.timestamp DESC

WITH employee, head(collect(shift)) as shift

MATCH (shift)<-[:CONTINUE*]-(shifts)

WITH employee.firstname as first_name, 
     employee.lastname as last_name, 
     SUM(shift.interval) as time_on_floor

// Only return results for staff on the floor more than 80 minutes
WHERE time_on_floor >= 80
RETURN first_name, last_name, time_on_floor
在这个查询中,我们询问数据库哪些员工在特定的一天连续在地板上工作了80分钟或更长时间?将班次分为20分钟的连续间隔,指出系列中的下一个班次为“继续”或“中断”

首先,使用索引属性匹配日期。然后,通过遍历datetime多级索引,扫描一天中的小时数以查找连接的事件。然后颠倒事件的顺序以获取系列中最新的事件。然后遍历,直到遇到中断关系。最后,应用地板上的时间大于或等于80分钟的条件

在这种情况下,多级日期时间索引中的节点遍历在性能方面是否比处理日期的索引属性要好得多

不,对于这种类型的数据结构,日期的索引属性比遍历性能更好

下面是使用混合方法的详细示例。考虑下面的子图,其中ELIPSES指示图中的连续模式。

请查看获取或创建多级日期时间索引的完整日历密码脚本。此数据结构允许您从一个日期遍历到另一个日期,以获取时间序列的事件范围。将索引属性匹配和遍历结合起来是最好的方法,并且在正确建模时表现良好

例如,考虑下面的密码查询:

// What staff have been on the floor for 80 minutes or more on a specific day?
WITH { day: 18, month: 1, year: 2014 } as dayMap

// The dayMap field acts as a parameter for this script
MATCH (day:Day { day: dayMap.day, month: dayMap.month, year: dayMap.year }),
      (day)-[:FIRST|NEXT*]->(hours:Hour),
      (hours)<-[:BEGINS]-(shift:Event),
      (shift)<-[:WORKED]-(employee:Employee)

WITH shift, employee
ORDER BY shift.timestamp DESC

WITH employee, head(collect(shift)) as shift

MATCH (shift)<-[:CONTINUE*]-(shifts)

WITH employee.firstname as first_name, 
     employee.lastname as last_name, 
     SUM(shift.interval) as time_on_floor

// Only return results for staff on the floor more than 80 minutes
WHERE time_on_floor >= 80
RETURN first_name, last_name, time_on_floor
在这个查询中,我们询问数据库哪些员工在特定的一天连续在地板上工作了80分钟或更长时间?将班次分为20分钟的连续间隔,指出系列中的下一个班次为“继续”或“中断”

首先,使用索引属性匹配日期。然后,通过遍历datetime多级索引,扫描一天中的小时数以查找连接的事件。然后颠倒事件的顺序以获取系列中最新的事件。然后遍历,直到遇到中断关系。最后,应用地板上的时间大于或等于80分钟的条件