2017-06-17 10 views
0

Ich arbeite an etwa 50000 Tweets als Knoten mit ähnlichen Daten wie unten gezeigt.Neo4J Optimsation zum Erstellen von Beziehungen zwischen Knoten

{ "date": "2017-05-26T09:50:44.000Z", "author_name": "djgoodlook", "share_count": 0, "mention_name": "firstpost", "tweet_id": "868041705257402368", "mention_id": "256495314", "location": "pune india", "retweet_id": "868039862774931456", "type": "Retweet", "author_id": "103535663", "hashtag": "KamalHaasan" }

Ich habe versucht, Beziehungen zwischen Tweets mithilfe von folgendem Befehl MATCH (a:TweetData),(b:TweetData) WHERE a.location = b.location AND NOT a.tweet_id = b.tweet_id CREATE (a)-[r:SameLocation]->(b) RETURN r

Und mit diesem Befehl I Beziehung machen nicht in der Lage war, die gleiche Lage zu machen, da es mehr als 20 Stunden dauert ist und immer noch nicht die Ergebnisse produziert. Während für die Hashtag-Beziehung es mit einem ähnlichen Befehl gut funktionierte, dauerte es ungefähr 5 Minuten. Ist ihre andere Methode, um eine Beziehung herzustellen oder diese Abfrage zu optimieren.

Antwort

1

Ja. Stellen Sie zunächst sicher, dass Sie über einen Index verfügen: TweetData (Standort), das ist die wichtigste Änderung, da ohne jeden Knoten alle 50k: TweetData-Knoten für einen gemeinsamen Standort (das sind 50k^2 Suchvorgänge) gescannt werden müssen.

Als nächstes ist es besser, sicherzustellen, dass die ID eines Knotens kleiner ist als die andere, sonst erhalten Sie die gleichen Knotenpaare zweimal, wobei nur die Reihenfolge umgekehrt ist, was zu zwei Beziehungen für jedes Paar führt, eins in jede Richtung. anstatt nur die einzelne Beziehung, die Sie wollen.

Zuletzt, müssen Sie wirklich alle Beziehungen zurückgeben? Das kann Ihren Browser töten, vielleicht nur die Anzahl der hinzugefügten Beziehungen.

MATCH (a:TweetData) 
MATCH (b:TweetData) 
WHERE a.location = b.location AND a.tweet_id < b.tweet_id 
CREATE (a)-[r:SameLocation]->(b) 
RETURN count(r) 

Eine andere Sache zu (stark) prüfen, ist stattdessen gemeinsame Positionen auf diese Weise der Verfolgung, erstellen: Location Knoten statt, und verknüpfen alle: TweetData Knoten zu. Ort (Name), dann:

Sie einen Index oder eine eindeutige Einschränkung auf benötigen

MATCH (a:TweetData) 
MERGE (l:Location {name:a.location}) 
CREATE (a)-[:LOCATION]->(l) 

Dieser Ansatz auch selbst mehr verleiht leicht zu Dosierung, wenn 50k Knoten auf einmal zu viel. Sie können einfach LIMIT und SKIP nach Ihrem Match zu a verwenden.

+0

Danke für Ihren Vorschlag, es hat mir wirklich geholfen. Ich konnte den ersten Teil nicht verstehen, wo Sie gesagt haben, wie wir 50k^2 Lookups außer LIMIT und SKIP reduzieren sollen. ** Stellen Sie sicher, dass Sie einen Index haben: TweetData (Standort), das ist die wichtigste Änderung ** –

+0

Lesen Sie die [Dokumentation zu Indizes und Einschränkungen] (http://neo4j.com/docs/developer-manual/current/cypher/schema/index /). Wenn Sie viele Knoten haben und einen Knoten eines bestimmten Typs nach einer bestimmten Eigenschaft suchen müssen, empfiehlt es sich, einen Index für das Label/die Eigenschaft zu haben, damit Ihre Übereinstimmung sehr schnell wird. – InverseFalcon

Verwandte Themen