创建一个可以使用py2neo的Neo4j日期树

时间:2014-07-14 14:19:33

标签: neo4j cypher py2neo

我正在尝试在我的Neo4j数据库中构建一个日期树,该数据库将与Nigel Small的py2neo库中的日历模块一起使用。

我在这里使用了Mark Needham的入门代码(http://java.dzone.com/articles/neo4j-cypher-creating-time),但是没有将所有Year节点连接到主日历节点,这是py2neo库所必需的。 (这里的文档:http://book.py2neo.org/en/latest/calendar/

我修改了Mark的代码,尝试创建一个主节点来连接所有这些年:

CREATE (x:Calendar {name:'master'})
WITH range(2005, 2014) AS years, range(1,12) as months
FOREACH(year IN years | 
  CREATE (y:Year {year: year})
  MERGE (x)-[:YEAR]->(y)
  FOREACH(month IN months | 
    CREATE (m:Month {month: month})
    MERGE (y)-[:MONTH]->(m)
    FOREACH(day IN (CASE 
                      WHEN month IN [1,3,5,7,8,10,12] THEN range(1,31) 
                      WHEN month = 2 THEN 
                        CASE
                          WHEN year % 4 <> 0 THEN range(1,28)
                          WHEN year % 100 <> 0 THEN range(1,29)
                          WHEN year % 400 <> 0 THEN range(1,29)
                          ELSE range(1,28)
                        END
                      ELSE range(1,30)
                    END) |      
      CREATE (d:Day {day: day})
      MERGE (m)-[:DAY]->(d))))

发生的事情是,有一个节点(带有日历标签)正在创建但没有附加到它的关系,而有一个节点(没有标签)正在创建并附加到每个年度节点。

我知道这可能是一个非常简单的解决办法,但我是CYPHER的新手,我真的很难解决这个问题。

1 个答案:

答案 0 :(得分:5)

您忘记通过WITH

传输日历主文件“x”
CREATE (master:Calendar { name:'master' })
WITH range(2005,2014) AS years, range(1,12) AS months,master
FOREACH (year IN years | 
         CREATE (y:Year { year: year })
         MERGE (master)-[:YEAR]->(y)
         FOREACH (month IN months | 
                  CREATE (m:Month { month: month })
                  MERGE (y)-[:MONTH]->(m)
                  FOREACH (day IN (
                    CASE
                    WHEN month IN [1,3,5,7,8,10,12]
                    THEN range(1,31)
                    WHEN month = 2
                    THEN
                    CASE
                    WHEN year % 4 <> 0
                    THEN range(1,28)
                    WHEN year % 100 <> 0
                    THEN range(1,29)
                    WHEN year % 400 <> 0
                    THEN range(1,29)
                    ELSE range(1,28) END ELSE range(1,30) END )| 
                           CREATE (d:Day { day: day })
                           MERGE (m)-[:DAY]->(d))))