2017-06-21 5 views
1

ich lerne, wie Neo4j verwenden, und ich baue ein ziemlich großes soziales Netzwerk einige Daten verwenden, die ich in einem JSON-Datei haben.Neo4j - Erstellen Sie Beziehungen von JSON Liste

Die Dateistruktur sieht wie folgt aus:

{ 
    "users": [ 
       {"id":"1", "name":"Bob", friends: ["2","3"]}, 
       {"id":"2", "name":"Alice", friends: ["1"]}, 
       {"id":"3", "name":"Robert", friends: ["1","4","5"]}, 
       ... 
    ]  
} 

this guide Im Anschluss ich es geschafft, alle Knoten mit dem folgenden Cypher Abfrage zu erstellen:

WITH {json} AS data 
UNWIND data.users AS user 
MERGE (u:User {user_id: user.id, name: user.name}) 

Aber jetzt bin ich stecken ich m nicht ganz sicher, wie die Beziehungen zwischen den Knoten, wie im Feld friends definiert, zu erstellen. Sollte ich das UNWIND das friends Feld auch? Sollte ich irgendwie über jeden von mir erstellten Knoten iterieren und eine Beziehung zu seinen Freunden hinzufügen? Vielleicht ist das eine grundlegende Frage, aber ich beginne gerade mit Cypher.

Antwort

0

Ja, Sie sollten UNWIND die friends Spalte auch. Sie könnten die gleichen Daten ein zweites Mal durchgehen, die Benutzer und ihre Freunde durch id finden und sie dann anschließen.

So etwas wie dies funktionieren würde

WITH {json} AS data 
UNWIND data.users AS user 

// for each collection of friends 
UNWIND user.friends as friend 

// find the current user and their friends 
MATCH (u:User {user_id: user.id}), (f:User {user_id: friend}) 
MERGE (u)-[:FRIENDS]-(f) 

Noch besser ist es den Anwender findet nur einmal und nicht für jeden Freund und dann in einem separaten Klausel jeden Freund entsprechen und sie anschließen.

WITH {json} AS data 
UNWIND data.users AS user 

// first create/find the user in the graph 
MATCH (u:User {user_id: user.id}) 
WITH user, u 

// iterate through each collection of friends 
UNWIND user.friends as friend 

// find each friend 
MATCH (f:User {user_id: friend}) 

// hook them up 
MERGE (u)-[:FRIENDS]-(f) 

oder Sie es in einem Durchlauf der Liste tun könnten ...

WITH {json} AS data 
UNWIND data.users AS user 

// first create/find the user in the graph 
MERGE (u:User {user_id: user.id}) 
ON CREATE SET u.name = user.name 
WITH u, user 

// iterate through each collection of friends 
UNWIND user.friends as friend 

// find/create stub for each of the friends 
MERGE (f:User {user_id: friend}) 

// hookup friends 
MERGE (u)-[:FRIENDS]-(f) 
+0

Ich habe versucht, Ihre zweite Lösung und ich hatte 'user' zur' WITH' Anweisung zu geben, um zu kompilieren . Wie auch immer, es erstellt keinen Knoten. – Alessandro

+0

good catch - ich habe die Abfrage 2 und 3 aktualisiert, um den Zusatz des Benutzers zur Klausel 'WITH' zu reflektieren. Die zweite Abfrage sollte nach der ersten Abfrage ausgeführt werden, mit der die Knoten erstellt wurden. Die dritte Abfrage sollte die Knoten und die Beziehungen in einem Durchgang erstellen. –

+0

Entschuldigung, ich missverstanden. Meine Abfrage + Ihre zweite Abfrage funktioniert, während die dritte scheint zu hängen und nie abgeschlossen. (Wenn Sie mit dem Java-Treiber für Neo4j vertraut sind, scheint es, dass es nie die 'Transaktion' schließt). Ich teste diese Abfragen mit einer Beispieldatei von 100 Zeilen, aber meine eigentliche JSON-Datei enthält fast eine Million Zeilen, daher weiß ich nicht, ob einer dieser Ansätze durchführbar ist. Ich wusste nicht, dass sie so schwer sind. – Alessandro

Verwandte Themen