Création de relations automatique

55 views
Skip to first unread message

cdu8...@gmail.com

unread,
Apr 12, 2015, 4:45:06 PM4/12/15
to neo...@googlegroups.com
Bonjour,

J'ai un fichier CSV avec des personnes, des technologies et des notes associées indiquant le niveau de maîtrise.

Comment faire pour créer des relations automatiques avec une propriété correspondant au niveau en question ?



Merci.

Frédéric

PS :
CREATE CONSTRAINT ON (f:Firstname) ASSERT f.name IS UNIQUE
LOAD CSV WITH HEADERS FROM
'file:c:/Users/Fred/Desktop/person.csv' AS line FIELDTERMINATOR ';'
WITH line
CREATE (f:Firstname {name: line.Firstname})
CREATE (c:Cisco {name: 'Cisco'})
CREATE (l:Linux {name: 'Linux'})
CREATE (w:Windows {name: 'Windows'})
person.csv

Benoit Simard

unread,
Apr 13, 2015, 2:36:36 AM4/13/15
to cdu8...@gmail.com, neo...@googlegroups.com
Bonjour,

Je verrais plutôt un script du genre comme ça :

LOAD CSV WITH HEADERS FROM 'file:c:/Users/Fred/Desktop/person.csv' AS line FIELDTERMINATOR ';' 

// Création du noeud avec le label 'Person' correspondant
CREATE (p:Person {name: line.Firstname})

// Création si nécessaire, du noeud 'Techno"
Merge (linux:Techno {name: 'linux'})
Merge (windows:Techno {name: 'windows'})
Merge (cisco:Techno {name: 'cisco'})

// Création des relations
CREATE (p)-[:HAS_KNWOLEDGE {level:line.windows} ]->(windows)
CREATE (p)-[:HAS_KNWOLEDGE {level:line.Linux} ]->(linux)
CREATE (p)-[:HAS_KNWOLEDGE {level:line.Cisco} ]->(cisco)


Ce script fait le travail même s'il n'est pas optimisé :
  - a chaque fois on fait un merge sur sur les techno : à remplacer par une récupération par index
  - est-ce qu'on créé une relation si niveau est de 0 ?

Si possible, le mieux ce serait d'avoir un CSV avec les informations suivants : firstname ; technology ; level
Je vous conseil de lire la doc sur le 'merge' (http://neo4j.com/docs/stable/query-merge.html).

Sincèrement.
--
Benoît Simard
@logisima
http:/www.bsimard.com

cdu8...@gmail.com

unread,
Apr 13, 2015, 8:31:59 AM4/13/15
to neo...@googlegroups.com
Bonjour M. SIMARD,

Merci beaucoup, cela fonctionne.
Effectivement, si l'on a une valeur NULL ou 0, dans ce cas, il n'y a pas de relation.

Sincèrement,

Frédéric

Michael Hunger

unread,
Apr 13, 2015, 8:52:59 AM4/13/15
to Benoit Simard, cdu8...@gmail.com, neo...@googlegroups.com
How about this? As you can create those nodes _before_ the LOAD CSV

// Création si nécessaire, du noeud 'Techno"
Merge (linux:Techno {name: 'linux'})
Merge (windows:Techno {name: 'windows'})
Merge (cisco:Techno {name: 'cisco'})

WITH linux, windows, cisco

LOAD CSV WITH HEADERS FROM 'file:c:/Users/Fred/Desktop/person.csv' AS line FIELDTERMINATOR ';'  

// Création du noeud avec le label 'Person' correspondant
CREATE (p:Person {name: line.Firstname}) 

// Création des relations
CREATE (p)-[:HAS_KNWOLEDGE {level:line.windows} ]->(windows)
CREATE (p)-[:HAS_KNWOLEDGE {level:line.Linux} ]->(linux)
CREATE (p)-[:HAS_KNWOLEDGE {level:line.Cisco} ]->(cisco)

cdu8...@gmail.com

unread,
Apr 13, 2015, 9:59:47 AM4/13/15
to neo...@googlegroups.com, logi...@gmail.com, cdu8...@gmail.com
Hello Mr HUNGER,

I'll try this one but i've got this error message :
linux not defined (line 1, column 6) "WITH linux, windows, cisco" ^


Another question please
. I did this request for example to find people with Cisco knowledge at level 3 :

//Knowledge Cisco en fonction du level
MATCH (p)-[:HAS_KNWOLEDGE {level:'3'}]->(cisco:Cisco {name: 'Cisco'})
RETURN p, (cisco)

How should i do if i want to find people with Cisco knowledge > 1 for example ?

And I've got the same question when instead of having one Technology, i've got two in my request as for example :

//Knowledge Cisco et Windows en fonction du level
MATCH (windows:Windows {name: 'Windows'})<-[:HAS_KNWOLEDGE {level:'1'}]-(p)-[:HAS_KNWOLEDGE {level:'1'}]->(cisco:Cisco {name: 'Cisco'})
RETURN p, (windows), (cisco)

How should i write my request if i want results for for example Cisco level > 1 and Windows level > 2 ?

Thanks for your help.

Regards,

Frederic

Michael Hunger

unread,
Apr 13, 2015, 10:39:14 AM4/13/15
to cdu8...@gmail.com, neo...@googlegroups.com, logi...@gmail.com
It is all one statement, including the MERGE at the beginning:

Merge (linux:Techno {name: 'linux'})
Merge (windows:Techno {name: 'windows'})
Merge (cisco:Techno {name: 'cisco'})
WITH linux, windows, cisco
LOAD CSV WITH HEADERS FROM 'file:c:/Users/Fred/Desktop/person.csv' AS line FIELDTERMINATOR ';'  
CREATE (p:Person {name: line.Firstname}) 
CREATE (p)-[:HAS_KNWOLEDGE {level:line.windows} ]->(windows)
CREATE (p)-[:HAS_KNWOLEDGE {level:line.Linux} ]->(linux)
CREATE (p)-[:HAS_KNWOLEDGE {level:line.Cisco} ]->(cisco)

Benoit Simard

unread,
Apr 13, 2015, 1:41:27 PM4/13/15
to neo...@googlegroups.com
Re,

Mes commentaires sont inlines.

Sincèrement.


Le 13/04/2015 15:59, cdu8...@gmail.com a écrit :
Hello Mr HUNGER,

I'll try this one but i've got this error message :
linux not defined (line 1, column 6) "WITH linux, windows, cisco" ^
Comme expliqué par Michael, il faut exécuter tout le script, avec les merge en début.

Another question please
. I did this request for example to find people with Cisco knowledge at level 3 :

//Knowledge Cisco en fonction du level
MATCH (p)-[:HAS_KNWOLEDGE {level:'3'}]->(cisco:Cisco {name: 'Cisco'})
RETURN p, (cisco)
Dans votre requête vous avez utilisez un label "Cisco" sur les noeuds, c'est normal ?
Dans nos exemples on avait mis le label 'Techno' :


//Knowledge Cisco en fonction du level
MATCH
    (p)-[:HAS_KNWOLEDGE {level:'3'}]->(cisco:Techno {name: 'Cisco'})
RETURN
    p, cisco


How should i do if i want to find people with Cisco knowledge > 1 for example ?
Il suffit de nommer la relation et d'ajouter une clause where :

MATCH
    (p)-[r:HAS_KNWOLEDGE]->(cisco:Techno {name: 'Cisco'})
WHERE
    r.level > 1
RETURN
    p, cisco


And I've got the same question when instead of having one Technology, i've got two in my request as for example :

//Knowledge Cisco et Windows en fonction du level
MATCH (windows:Windows {name: 'Windows'})<-[:HAS_KNWOLEDGE {level:'1'}]-(p)-[:HAS_KNWOLEDGE {level:'1'}]->(cisco:Cisco {name: 'Cisco'})
RETURN p, (windows), (cisco)
Pour plus de lisibilité, il est préférable de mettre deux clauses MATCH :

MATCH
    (p)-[relCisco:HAS_KNWOLEDGE]->(cisco:Techno {name: 'Cisco'}),
    (p)-[relWin:HAS_KNWOLEDGE]->(win:Techno {name: 'Windows'})
WHERE
    relCisco.level > 1 AND
    relWin.level > 2
RETURN
    p, win, cisco

cdu8...@gmail.com

unread,
Apr 13, 2015, 3:48:17 PM4/13/15
to neo...@googlegroups.com
Merci beaucoup.
Cela fonctionne.
J'ai remplacé Techno par Linux, Windows et Cisco cela permet d'avoir des couleurs différentes.
J'ai utilisé la fonction TOINT pour convertir la valeur associée au level qui était stockée en tant que STRING.

//Connait Cisco >1 et Windows>2
MATCH
    (p)-[relCisco:HAS_KNWOLEDGE]->(cisco:Cisco {name: 'Cisco'}),
    (p)-[relWin:HAS_KNWOLEDGE]->(win:Windows {name: 'Windows'})
WHERE
    TOINT (relCisco.level) > 1 AND
    TOINT (relWin.level) > 2
RETURN
    p, win, cisco

J'ai mis un aperçu en pièce jointe.
Je vais regarder comment traiter les valeurs nulles.

J'ai aussi une autre interrogation mais plus délicate je pense.
Avec ce qui a été fait au dessus, il est possible de créer une équipe en fonction des besoins en techno et des aptitudes des personnes par exemple. Maintenant si l'on se met à la place d'un Manager qui doit valider des congés.
Peut-on ajouter une timeline, une personne étant soit présente soit en congés et interroger le graphe pour voir s'il y a des trous par exemple ?

Sincèrement,

Frédéric
Resume.docx
person.csv
Reply all
Reply to author
Forward
0 new messages