2016-11-28 3 views
0

Ich bin sehr neu in Neo4j:Einrichten der Beziehungen mit einem Tisch für die Links

Ich ziehe MySQL-Daten, die Daten zu visualisieren und anaylise aber ich kann nicht die Beziehungen aufgebaut.

Bisher sieht mein Build-Skript wie folgt aus:

// Create Players 
USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:player.csv" AS row 
CREATE (:Player { playerID: row.id, name: row.Name }); 
CREATE INDEX ON :Player(name); 
CREATE INDEX ON :Player(playerID); 

// Create Team 
USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:team.csv" AS row 
CREATE (:Team { teamID: row.id }); 
CREATE INDEX ON :Team(teamID); 

// Create PlayerLinks 
USING PERIODIC COMMIT 
LOAD CSV WITH HEADERS FROM "file:playerlinks.csv" AS row 
CREATE (:Links { linkID: row.id, fromPlayerID: row.fromPlayerID, toPlayerId: row.toPlayerId, teamID: row.teamID, years: row.years }); 


MATCH (p:Player),(t:Team), (l:Links) 
WHERE l.fromPlayerID = p.playerID 
AND  l.toPlayerId = p.playerID 
AND  l.teamID = t.teamID 
CREATE 

Die Tabelle playerlinks die Beziehungen enthält Ich mag würde

Hier ist ein Diagramm erstellen, was ich zu erreichen Ziel: Players

+1

Zum einen müssen Sie keinen Index für jeden hinzugefügten Knoten erstellen. Sobald ein Schema-Index erstellt wurde, wird er auf alle Knoten angewendet, die mit diesem Label hinzugefügt wurden. Wenn Ihre Indizes bereits vorhanden sind, können Sie sie vollständig aus Ihrem Skript entfernen. Obwohl ich empfehlen würde, eine eindeutige Einschränkung anstelle eines Indexes zu verwenden, wenn es um Ihre ID-Felder geht. Außerdem haben Sie nicht angegeben, was mit Ihrem Skript nicht funktioniert. Können Sie die Fehler einfügen, die Sie versuchen, es auszuführen, oder beschreiben Sie besser die Probleme, denen Sie begegnen? – InverseFalcon

+1

Vielleicht ein repräsentatives Diagramm hinzufügen, wie die resultierende Struktur aussehen soll? –

+0

Können Sie uns auch etwas über Ihre: Links erklären? Ich kann verstehen, einen Spieler mit einem Team zu verbinden, aber Sie geben auch in der gleichen Zeile einen Link von einem Spieler zum anderen an, ohne die Art dieser Beziehung zu erwähnen. Was soll dieser Player zu Player Link darstellen? – InverseFalcon

Antwort

1

Sieht aus, als ob Sie fast da sind, eigentlich.

Wie in meinen Kommentaren zu der Frage selbst erwähnt, sollten Sie die Indexerstellung aus Ihren Skripts löschen (diese sollten nur einmal vor dem Import angewendet werden und Sie sollten eindeutige Einschränkungen für ID-Felder berücksichtigen).

Wie für Ihre: Links Knoten, ist Ihr Plan, sie nur zu verwenden, um Beziehungen zu erstellen, oder planen Sie, sie danach zu behalten?

Der Ansatz für die Führung: Verbindungen um als Zwischenknoten mit Beziehungen von Ihren: Verbindungen Knoten auf andere Elemente des Diagramms, könnte wie folgt aussehen:

MATCH (l:Links) 
WITH l 
MATCH (p1:Player), (p2:Player), (t:Team) 
WHERE l.fromPlayerID = p1.playerID 
AND  l.toPlayerId = p2.playerID 
AND  l.teamID = t.teamID 
MERGE (l)-[:Teammate]->(p1) 
MERGE (l)-[:Teammate]->(p2) 
MERGE (l)-[:PlayedOn]->(t) 

Das Ihre verbindet: Knoten Links zu den Spielern, die sind Teammitglieder, an das: Team, auf dem sie gespielt haben, und dein: Links-Knoten hält die Jahre zusammen, in denen sie zusammen gespielt haben. An diesem Punkt können Sie die Eigenschaften linkID, toPlayerID, playerID und teamID vom Knoten entfernen, da db-Beziehungen in einem Graph dazu tendieren, Fremdschlüssel beim Übersetzen aus einer relationalen Datenbank zu ersetzen, und weil Sie wahrscheinlich nicht nachschlagen werden: Verknüpfungen Knoten nach ID.

Alternativ (und nach Ihrem gewünschten Diagramm) können Sie die Informationen auf der: Links Knoten verwenden, um Beziehungen zwischen: Spielern direkt zu erstellen. Sie können Attribute für die Beziehungen für die Anzahl der Jahre, die zusammen gespielt werden, und die ID (oder den Namen) des Teams, auf dem sie gespielt haben, festlegen. Beachten Sie, dass die Beziehung selbst nicht auf den: Team-Knoten zeigen kann, auf dem die Spieler zusammen gespielt haben, obwohl Sie diese Informationen verwenden können, um Folgendes zu erstellen: SpieledOn-Beziehungen von: Spielern zu: dem in Frage kommenden Team.

Diese Art der Modellierung könnte wie folgt aussehen:

MATCH (l:Links) 
WITH l 
MATCH (p1:Player), (p2:Player), (t:Team) 
WHERE l.fromPlayerID = p1.playerID 
AND  l.toPlayerId = p2.playerID 
AND  l.teamID = t.teamID 
MERGE (p1)-[:Teammate{years: l.years, team: t.teamID}]->(p2) 
MERGE (p1)-[:PlayedOn]->(t) 
MERGE (p2)-[:PlayedOn]->(t) 

Denken Sie daran, das Verschmelzen der: Teamkollege Beziehung langsam sein kann. Wenn Sie dies nur einmal ausführen möchten, können Sie CREATE anstelle von MERGE verwenden.

+0

danke für die Hilfe, habe ich die zweite Abfrage als es ausgeführt sieht so aus, wonach ich strebe. Allerdings, wenn ich es ausführen, gibt es keine Fehler, aber die Beziehungen sind nicht erstellt (wie ich kann sie nicht im Browser sehen) –

+0

Sie werden sie nicht als Ergebnis der Erstellung Abfrage, sondern Sie sehen sollte Feedback sehen, dass die Beziehungen erstellt werden. Um nach Spielern zu suchen, die Teamkameraden sind, versuche diese Abfrage: 'MATCH (p1: Spieler) - [r: Teamkamerad] -> (p2: Spieler) RETURN p1, r, p2' – InverseFalcon

+0

keine Rückmeldung als solche und diese Abfrage gibt keine Ergebnisse zurück Ich kann sehen, dass alle Knoten erstellt wurden. jedoch beendet die Beziehung Schöpfung in 163ms und die Beziehungstypen bleibt leer –

Verwandte Themen