2017-09-08 1 views
0

je le fichier suivant .csv contenantJe ne peux pas créer une relation entre les nœuds et les prédécesseurs en Cypher tout en créant le graphique

"NODE","PREDECESSORS" 
"1","" 
"2","1" 
"3","1;2" 

Je veux créer avec les nœuds: 1,2,3 et son relations 1-> 2-> 3 et 1-> 3 je l'ai déjà essayé de le faire:

LOAD CSV WITH HEADERS FROM 'file:///A.csv' AS line 
CREATE (:Task { NODE: line.NODE, PREDECESSORS: SPLIT(line.PREDECESSORS ';')}) 
FOREACH (value IN line.PREDECESSORS | 
      MERGE (PREDECESSORS:value)-[r:RELATIONSHIP]->(NODE)) 

Mais il ne fonctionne pas, qui est, il ne crée pas de relation. S'il vous plaît, pourriez-vous m'aider?

+0

Tout d'abord, êtes-vous sûr que vous utilisez le chemin dir correct pour votre dossier? Etes-vous sur Windows ou Linux? Ce 'fichier: ///' semble un peu générique (... et faux, je dirais) –

+0

J'utilise MAC OS et le chemin est correct, car je peux lire depuis le dossier 'import' de neo4j, J'ai juste besoin de créer des relations –

Répondre

1

Le problème est dans votre MERGE:

MERGE (PREDECESSORS:value)-[r:RELATIONSHIP]->(NODE) 

Ceci est la fusion d'une: valeur noeud étiqueté et en lui attribuant aux PRÉDÉCESSEURS variables, qui ne peut pas être ce que vous voulez faire.

Une meilleure approche ne consisterait pas à sauvegarder les données du prédécesseur dans le nœud, il suffit de l'utiliser pour faire correspondre les nœuds concernés et créer les relations.

Il sera également utile d'avoir un index sur: Task (NODE) ​​pour que vos correspondances avec les prédécesseurs soient rapides. Rappelez-vous également que les requêtes chiffrées ne traitent pas la requête entière pour chaque ligne, mais que chaque opération de la requête est traitée pour chaque ligne, donc une fois que le CREATE s'exécute, tous les nœuds seront créés, pas besoin d'utiliser MERGE les noeuds prédécesseurs.

Essayez quelque chose comme ceci:

LOAD CSV WITH HEADERS FROM 'file:///A.csv' AS line 
CREATE (node:Task { NODE: line.NODE}) 
WITH node, SPLIT(line.PREDECESSORS, ';') as predecessors 
MATCH (p:Task) 
WHERE p.NODE in predecessors 
MERGE (p)-[:RELATIONSHIP]->(node) 
+0

Cela fonctionne merci –