2016-08-12 7 views
0

Ich habe ungefähr 10 k Benutzerknoten auf meiner Diagrammdatenbank. Ich weiß es nicht zu viel, aber ich suche nach der besten Lösung für meinen Fall.Welcher Fall hat mehr Leistung

Ich muss einige meiner Benutzer markieren und später danach suchen.

Ich kam mit zwei Lösungen (zumindest für jetzt), aber ich konnte mich nicht entscheiden, welches für die Leistung am besten ist, was denkst du über meine möglichen Lösungen?

1 - Ich kann hinzufügen neue Eigenschaft alle meinen Benutzerknoten mit Standardwert false.

MATCH (u:User) SET u.marked = false 

Danach werde ich markierte Eigenschaft auf True für alle Benutzer setzen, die ich später abfragen muss. Sagen wir, es gibt 50 von ihnen.

Später, als ich diese markiert Benutzer benötigen i abfragen wie:

MATCH (u:User) WHERE u.marked = true RETURN u 

2 - Ich kann neue Eigenschaft hinzufügen nur für diejenigen Benutzer, die ich später benötigen und verändert nicht andere Benutzerknoten . Wie folgt aus:

MATCH (u:User) WHERE u.id IN [...,123,456,789,...] SET u.marked = true 

später, als ich markierte Benutzer benötigen, werde ich fragen wie:

MATCH (u:User) WHERE u.marked = true RETURN u 

oder

MATCH (u:User) WHERE EXISTS(u.marked) AND u.marked = true RETURN u 

Wenn Sie eine andere Art und Weise wissen, dass mein Problem löst, ich bin offen für Meinungen.

Vielen Dank im Voraus.

+0

Sie könnten markierte Benutzer IDs in separaten Tabelle speichern. Und wenn Sie sie erneut markieren müssen, löschen Sie einfach vorherige Ergebnisse und speichern neue.Später könnten Sie bei Bedarf weitere Eigenschaften hinzufügen. – Edgar

+0

Verwenden Sie 'PROFILE' vor der Abfrage erhalten Sie Details davon. wie 'PROFILE MATCH (u: Benutzer) WHERE u.marked = wahr RETURN u' –

+0

Nur damit Sie wissen, in der zweiten Option in der Beschreibung, die Übereinstimmung, wo u.marked = true ist genug. Eine Existenzprüfung ist hier nicht erforderlich. – InverseFalcon

Antwort

1

Der übliche Ansatz, einen Index zu erstellen wäre:

CREATE INDEX ON :User(marked); 

Dann werden Ihre Anfragen Lage sein, schnell die bekommen markiert User Knoten, ohne alle von ihnen zu scannen.

@ InverseFalcons Antwort bietet einen weiteren möglichen Ansatz, die Erstellung eines Labels.

+0

Dieser scheint am besten zu meinem Fall zu passen, vielen Dank. – agdelen

0

Boolesche Felder sollten gut funktionieren. Usman Maqbools Rat, die verschiedenen Wege zu profilieren, ist gut ... tue das, um herauszufinden, was für dich am besten ist.

Eine andere Möglichkeit besteht darin, ein Etikett speziell dafür zu erstellen: MarkedUser, zum Beispiel. Denken Sie daran, dass Knoten mehrere Labels ohne Probleme haben können.

Sie können die Bezeichnung für Ihre Gruppe von Benutzern mit (für Benutzer) SET u:MarkedUser festlegen.

Lookup wird einfach, weil es alle Benutzer in diesem Label sind. Passen Sie einfach an, führen Sie Ihre Verarbeitung aus und entfernen Sie das Etikett. Wenn Sie dies alles in einer Abfrage tun, würde es wie folgt aussehen:

MATCH (u:MarkedUser) 
// do your processing here 
REMOVE u:MarkedUser 
Verwandte Themen