Neo4J 2.0如何重构数据库以引入Date节点

时间:2014-03-07 16:46:52

标签: cypher neo4j

我有一个我刚从SQL DB导入的数据库,例如我们称之为Order的属性名为PlacedOn的属性存储为DateTime,该属性存储为类似2013-05-01T02:15:18+00:00的节点的一部分。

我现在想要提取日期时间并创建一个关联,以便我能够轻松地查询所有Orders一个月或一年。

基本上我想要实现的是使关联看起来如下:

(o:Order)-[:PLACED_ON]->(d:Day)-[:BELONGS_TO]->(m:Month)-[:BELONGS_TO]->(y:Year)

对于性能测试,我创建了 1100000 nodes ,因此必须在我的c#代码中加载它并创建它是不切实际的,所以有没有一种方法用Cypher或任何其他方式在Webadmin中,我可以提取日月和年份部分,并使用上述关联创建节点。

此致 基兰

1 个答案:

答案 0 :(得分:0)

请查看此Cypher查询,了解如何在Neo4j 2.0中创建DateTime树:

https://gist.github.com/kbastani/8519557#file-calendaryear-cql

为每年的数据运行CalendarYear Cypher脚本。

您需要解析DateTime时间戳值以提取Year,Month,Day整数值。然后,对于您的每个订单,您需要附加一个日期节点。我建议您在导入数据时,在订单中添加具有年,月,日值的属性。

然后分批运行Cypher语句,在每年的每个月添加时间表,并附上记录:

MATCH (order:Order { month: 5, year: 2014 })
WITH collect(order) as orders
FOREACH (order in orders |
    MERGE (day:Day { day: order.day, month: order.month, year: order.year })
    CREATE (day)<-[:PLACED_ON]-(order))

现在,您可以使用时间轴索引查询数据。

MATCH (order:Order)-[:PLACED_ON]->(day:Day { day: 1, month: 5, year: 2013 })
RETURN order