2012-04-20 6 views
10

Ich spiele herum mit neo4j, und ich frage mich, ist es üblich, eine type Eigenschaft auf Knoten, die angeben, welche Art von Knoten es ist? Ich habe versucht, nach dieser Praxis zu suchen, und ich habe gesehen, dass einige Leute name für einen solchen Zweck verwenden, aber ich frage mich, ob es als eine gute Praxis angesehen wurde oder ob Indizes die praktikablere Methode wären.Neo4j Knoten Eigenschaftstyp

Ein Beispiel wäre ein "User" -Knoten, der Typ hätte: user, auf diese Weise, wenn der Index schlecht wäre, wäre ich in der Lage, einen All-Node-Scan durchzuführen und nach Typen von user suchen.

Antwort

7

Es stimmt, es hängt von Ihrem Anwendungsfall ab. Wenn Sie eine type -Eigenschaft hinzufügen und dann alle Benutzer finden möchten, haben Sie möglicherweise Probleme, da Sie diese Eigenschaft auf jedem Knoten untersuchen müssen, um zu den Benutzern zu gelangen. In diesem Fall würde der Index wahrscheinlich besser sein - aber nicht in Fällen, in denen Sie alle Benutzer mit Bedingungen und Beziehungen abfragen müssen, die im Index nicht verfügbar sind (es sei denn, Ihr Index ist die Quelle für den "Start"). Wenn Sie Graphen wie meins haben, wo ein Beziehungstyp zwei verschiedene Knotentypen impliziert, wie A- (weiß) - (B) und A oder B ein Benutzer oder ein Kunde sein kann, dann funktioniert es nicht.

Ihr Anwendungsfall ist wirklich wichtig - Graphen können Sie ganz einfach generie- ren, aber wichtig ist, dass Sie sie nach Ihrem Nutzungsmuster "abstimmen".

4

IMHO sollten Sie keine Typeigenschaft auf den Knoten legen müssen. Stattdessen besteht eine allgemeine Möglichkeit, alle Knoten eines bestimmten "Typs" zu referenzieren, alle Benutzerknoten mit einem Knoten zu verbinden, der "Benutzer" genannt wird. Auf diese Weise können Sie ausgehend vom Knoten Benutzer sehr einfach alle Benutzerknoten finden. Der Knoten "Benutzer" selbst kann indiziert werden, so dass Sie ihn leicht finden können, oder er kann mit dem Referenzknoten verbunden werden.

+5

Das einzige Problem dabei ist, dass, wenn Sie eine große Anzahl von Benutzern haben, werden Sie die Supernode Strafe zu schlagen beginnen. Ich mache das jetzt in neo4django (https://github.com/schollrly/neo4django) und erwäge, zu einem hyrbid-Index/Beziehungsansatz zu wechseln. –

+1

ich dieses Modell gesehen habe, denke ich, meine Sorge war, wenn der Index/Beziehung aus irgendeinem Grund gebrochen war, ist die Art des Knotens dann verloren, aber als @MattLuongo darauf hingewiesen, können wir mit bestimmten Attributen ableiten. – Nicholas

2

Ich denke, es liegt ganz bei Ihnen. Einige Leute mögen indexierte Typattribute, aber ich finde, dass sie am nützlichsten sind, wenn Sie andere indexierte Attribute haben, um die Anzahl der Indextreffer einzugrenzen (suchen Sie nach allen Benutzern, die älter als 21 Jahre sind).

Das sagte, wie @Luanne darauf hinweist, versuchen die meisten von uns, das Problem in-graph zuerst zu lösen. Eine andere Möglichkeit, dies zu tun (und meiner Meinung nach der natürlichere Weg) ist, den Beziehungstyp zu verwenden, um einen praktischen Knotentyp abzuleiten, dh "A - (weiß) -> B", also muss A ein Benutzer oder jemand anderes sein Ding, das "wissen" kann, und B muss ein anderer Benutzer sein, ein Thema oder ein anderes Objekt, das "bekannt sein kann".

2

Bei Client-APIs erleichtert die Modellierung des Elementtyps als Eigenschaft die Instanziierung des richtigen Domänenobjekts in Ihrem clientseitigen Code, sodass ich immer eine type-Eigenschaft für jeden Knoten/Scheitelpunkt einschließe.

Der "type" Var-Name wird häufig dafür verwendet, aber in einigen Sprachen wie Python ist "type" ein reserviertes Wort, also verwende ich "element_type" in Bulbs (http://bulbflow.com/quickstart/#models).

Dies ist nicht notwendig für Kanten/Beziehungen, da sie bereits einen Typ (die Bezeichnung) enthalten - beachten Sie, dass Neo4j auch das Schlüsselwort "type" anstelle von Label für Beziehungen verwendet.

2

Ich würde sagen, es ist gängige Praxis. Beispielsweise weiß Spring Data Neo4j genau, welcher Entitätstyp ein bestimmter Knoten ist. Jeder Knoten hat die Eigenschaft "type", die den qualifizierten Klassennamen der Entität enthält. Diese Eigenschaften werden automatisch in den Index "types" indiziert, so dass Knoten wirklich schnell nachgeschlagen werden können. Sie könnten Ihren Anwendungsfall genau so implementieren.

9

Labels wurden hinzugefügt 2,0 bis Neo4j. Sie beheben dieses Problem.

Sie können Knoten mit Labels erstellen:

CREATE (me:American {name: "Emil"}) RETURN me; 

Sie auf Etiketten bieten kann:

MATCH (n:American) 
WHERE n.name = 'Emil' 
RETURN n 

Sie eine beliebige Anzahl von Etiketten auf einem Knoten festlegen:

MATCH (n) 
WHERE n.name='Emil' 
SET n :Swedish:Bossman 
RETURN n 

Sie kann eine beliebige Anzahl von Labels auf einem Knoten löschen:

Etc ...