2017-04-21 3 views
1

J'essaie de résoudre un problème de l'affichage de relation 1: plusieurs dans neo4j. Mon jeu de données est comme ci-dessousNeo4j n'affiche qu'un seul nœud pour 1 à plusieurs relations

child,desc,type,parent 
1,PGD,Exchange,0 
2,MSE 1,MSE,1 
3,MSE 2,MSE,1 
4,MSE 3,MSE,1 
5,MSE 4,MSE,1 
6,BRAS 1,BRAS,2 
6,BRAS 1,BRAS,3 
7,BRAS 2,BRAS,4 
7,BRAS 2,BRAS,5 
10,NPE 1,NPE,6 
11,NPE 2,NPE,7 
12,OLT,OLT,10 
12,OLT,OLT,11 
13,FDC,FDC,12 
14,FDP,FDP,13 
15,Cust 1,Customer,14 
16,Cust 2,Customer,14 
17,Cust 3,Customer,14 
LOAD CSV WITH HEADERS FROM 'file:///FTTH_sample.csv' AS line 
CREATE(:ftthsample 
{child_id:line.child, 
desc:line.desc, 
type:line.type, 
parent_id:line.parent}); 

//Relations 
match (child:ftthsample),(parent:ftthsample) 
where child.child_id=parent.parent_id 
create (child)-[:test]->(parent) 

//Query: 
MATCH (child)-[childrel:test*]-(elem)-[parentrel:test*]->(parent) 
WHERE elem.desc='FDP' 
RETURN child,childrel,elem,parentrel 

Il retourne un affichage comme ci-dessous.

output

Je veux que les noeuds en double à afficher en un seul. Débutant avec Neo4J. Quelqu'un peut-il aider s'il vous plaît?

Répondre

0

Cela semble être une erreur dans votre requête de création de graphique. Vous avez quelques lignes dans votre requête spécifiant le même nœud à plusieurs reprises, mais avec plusieurs parents:

6,BRAS 1,BRAS,2 
6,BRAS 1,BRAS,3 

Je devine que vous voulez vraiment que ce soit un seul nœud, les relations parents aux noeuds avec le parent donné ids, au lieu de deux nœuds distincts.

Ajustons votre requête d'importation. Au lieu d'utiliser un CREATE sur chaque ligne, nous utiliserons MERGE, et juste sur le child_id, qui semble être votre clé primaire (peut-être envisager d'utiliser id à la place, car un nœud peut avoir un ID seul, sans avoir à considérer le contexte de savoir si c'est un parent ou un enfant). Nous pouvons utiliser l'ON CREATE clause après MERGE pour ajouter les autres propriétés que si le MERGE a donné lieu à la création de nœuds (au lieu de correspondre à un nœud existant.

qui assurera que nous avons un seul nœud créé par child_id.

plutôt que d'avoir à rematch l'enfant, on peut utiliser le nœud enfant que nous venons de créer, match sur le parent, et de créer la relation.

LOAD CSV WITH HEADERS FROM 'file:///FTTH_sample.csv' AS line 
MERGE(child:ftthsample {child_id:line.child}) 
ON CREATE SET 
child.desc = line.desc, 
child.type = line.type 

WITH child, line.parent as parentId 
MATCH (parent:ftthsample) 
WHERE parent.child_id = parentId 
MERGE (child)-[:test]->(parent) 

Notez que nous n'avons pas ajouté line.parent comme une propriété. Il est pas nécessaire, puisque nous utilisons seulement cela pour créer des relations, et après les relations les hanches sont là, nous n'en aurons plus besoin.

+0

Merci, ça marche –

+0

Désolé pour l'erreur. Différent de l'échantillon, mon ensemble de données réel a mon id ou les colonnes de jointure sont des valeurs de chaîne .. et certaines valeurs enfant peuvent avoir ou non un parent, la même chose vaut pour parent. C'est probablement la raison pour laquelle il me lance l'erreur "Impossible de fusionner un noeud en utilisant la valeur de propriété null pour child_id" J'ai essayé la solution que vous avez fournie ici, mais en lançant toujours l'erreur ... http://stackoverflow.com/questions/40794877/how-to-include-propriétés-avec-null-values-using-neo4j-merge Pouvez-vous s'il vous plaît vérifier. Désolé de vous bugter à nouveau. –

+0

Vous aurez besoin d'avoir une valeur unique à fusionner. Si vos données provenaient à l'origine d'une base de données relationnelle, vous auriez normalement un identifiant de clé primaire que vous utiliseriez pour la fusion. Sans clé primaire unique, vous ne pourrez pas fusionner ces nœuds, car il n'y a aucun moyen de savoir lesquels sont uniques. Vous pouvez fusionner avec toutes les propriétés au lieu de simplement child_id, même si je ne suis pas sûr que cela vous permette de contourner l'erreur. – InverseFalcon