2014-07-14 2 views
2

J'essaie de créer une arborescence de dates dans ma base de données Neo4j qui fonctionnera avec le module de calendrier de la bibliothèque py2neo de Nigel Small.Création d'un arbre de dates Neo4j qui fonctionnera avec py2neo

J'ai utilisé le code de démarrage de Mark Needham d'ici (http://java.dzone.com/articles/neo4j-cypher-creating-time), mais cela ne connecte pas tous les nœuds d'année à un nœud de calendrier principal, qui est requis pour la bibliothèque py2neo. (docs ici: http://book.py2neo.org/en/latest/calendar/)

J'ai modifié le code de Mark pour essayer de créer un nœud maître pour connecter tous les ans comme ceci:

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)))) 

Qu'est-ce qui se passe est qu'il ya un nœud (avec l'étiquette de calendrier) qui est créé mais aucune relation n'est associée, alors qu'un nœud (sans label) est créé et attaché à chaque nœud Year.

Je sais que c'est probablement une solution vraiment facile, mais je suis nouveau à CYPHER et j'ai vraiment du mal à comprendre cela.

Répondre

5

Vous avez oublié de transporter le maître du calendrier « x » à travers le AVEC

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)))) 
+0

Il m'a fallu quelques minutes pour voir votre changement de ligne 2; Je comprends maintenant. Merci! –

Questions connexes