2017-02-24 3 views
0

Ich evaluiere Neo4j für den Einsatz als Datenspeicher in einer interaktiven Anwendung. Mit dem Code unten bekomme ich ungefähr 40 ms für das Hinzufügen einer Beziehung, die für unsere Bedürfnisse viel zu langsam wäre, da unsere Modelle Zehntausende von Beziehungen haben können. Ist das typische Leistung? Irgendwelche Tipps zur Verbesserung des Codes? Ich habe mit 12 Relationstypen und insgesamt 6652 Relationen getestet.Neo4j Beziehung schreiben Leistung mit Neo4j.Driver.V1

using (var session = driver.Session()) 
{ 
    foreach (var relationType in relationTypes) 
    { 
     var nodeArray = relationType.Value.Select(n => new Dictionary<string, string> {{"from", n.Item1}, {"to", n.Item2}}).ToArray(); 
     var dictionary = new Dictionary<string, object> {{"nodes", nodeArray}}; 
     var relationCommand = 
      string.Format(
       "UNWIND $nodes as node WITH node.from as from, node.to as to " 
       + "MATCH (f {{nodeId:from}}), (t {{nodeId:to}}) " 
       + "CREATE (f)-[:" + relationType.Key + "]->(t) "); 
     session.Run(relationCommand, dictionary); 
    } 
} 
+0

Sie verwenden keine Beschriftungen und daher keine eindeutigen Einschränkungen/Indizes. Ihre Abfrage ist überhaupt nicht optimiert –

+0

Es ist sicherlich nicht optimiert. :) OK, also werden Labels benötigt, um MATCH effizient zu machen? –

+0

Labels + eine indizierte/eindeutige Einschränkung auf die Eigenschaft, die Sie passen auf (hier nodeId) so Lookups sind O (1) + 1: label + Eigenschaft –

Antwort

2

Die Verwendung von Labels, die mit einer indexierten Eigenschaft kombiniert werden, auf der die Übereinstimmung basiert, führt dazu, dass Abfragen extrem performant sind.

Also am besten:

Fügen Sie Etiketten zu Ihren Knoten hinzu.

CREATE (n:Label {id: 1}) für zB beim Erstellen von Knoten, oder wenn Sie eine generische Bezeichnung auf Ihre bereits erstellten Knoten hinzufügen möchten, können Sie

MATCH (n) SET n:Label 

Dann eine eindeutige Einschränkung für Ihre nodeId Eigenschaft erstellen tun:

CREATE CONSTRAINT ON (n:Label) ASSERT n.nodeId IS UNIQUE 

verwenden sie es dann in Ihrer Abfrage:

var relationCommand = 
      string.Format(
       "UNWIND $nodes as node WITH node.from as from, node.to as to " 
       + "MATCH (f:Label {{nodeId:from}}), (t:Label {{nodeId:to}}) " 
       + "CREATE (f)-[:" + relationType.Key + "]->(t) "); 
     session.Run(relationCommand, dictionary); 

die differenc Genießen e!

Verwandte Themen