1

Ist es in Ordnung, wenn wir in neo4j selbstreferentielle Knoten erstellen? Ich muss es in einer großen Datenumgebung verwenden, so dass die Leistung wirklich zählt. Ich habe ein Beispiel gefunden here, aber müssen mehr Meinungen dazu wissen. Generell welcher ist besser? Verwenden Sie selbst Referenzknoten oder um sie zu trennen, um Knoten mit unterschiedlichen Bezeichnungen und Beziehungen zu trennen? Mein Szenario besteht darin, E-Commerce-Tag-Gruppen und -Tags zu erstellen. Eine TAG_GROUP hat TAGs, das ist klar. Einige Tags können jedoch Unter-Tags enthalten. Also kann es 2 Lösungen dafür geben:Selbstreferentielle Knoten in neo4j

1) Um TAG- [hat] -TAG self-referencial Tag mit einigen Eigenschaften wie {parentID, isSubTag, ...} zu verwenden, das gute daran ist, dass ich kann mehr als eine Sub-Tag-Ebene durchlaufen. Ich bin mir jedoch nicht sicher, wie die Leistung sein wird.

2) TAH- verwenden [hat] -SUB_TAG. Nun, vielleicht ist dieser einfacher und leichter zu verstehen. Was aber, wenn die SUB_TAG selbst ein SUB_SUB-Tag hat?

Jede Hilfe wäre willkommen.

PSI werde Neo4j 3.0.1 Standalone-Server und Spring-Data-Neo4j 4.1.1

+0

Ich bin diese Frage nicht sicher, eine gute Passform für den Standort ist, da es keine eine Antwort ist. Ich würde empfehlen, den Ansatz zu wählen, der am saubersten ist und am besten zu Ihrem Datenmodell passt. Wenn Sie in der Praxis Probleme haben, müssen Sie sich nur um die Leistung sorgen. Ich kann nicht erkennen, warum die beiden Ansätze, die Sie beschreiben, sich anders verhalten würden; Selbstreferenzierung oder nicht sollte keinen Unterschied machen. – Mikesname

Antwort

2

Sprechen außerhalb des Anwendungsfalls von SDN verwenden, was Sie beschreiben, ist eine Hierarchie, die auf jeden Fall natürlich modelliert werden kann in Neo4J.

Die Vorstellung von Eltern/Kind muss nur mit Beziehungen, keine Notwendigkeit für Eigenschaften getan werden.

(Tag)-[:CHILD]->(Tag)-[:CHILD]->(Tag) 

Ich nehme an, Sie Produkte mit den dazugehörigen Tags haben würde, ein Tag kann dann tags ein Produkt:

(Tag)-[:TAGS]->(Product) 

für ein Produkt das zugehörige Etikett zu finden, ist so einfach wie:

MATCH (product:Product {id: 1}) 
OPTIONAL MATCH (product)<-[:TAGS]-(tag) 
RETURN product, collect(tags) as tag 

Das OPTIONAL MATCH berücksichtigt Produkte, die keine Tags haben, ohne die Abfrage zu unterbrechen

Wenn Sie die komplette Hierarchie der Tags pro Tag wollen das Produkt Tagging

MATCH (product:Product {id: 1}) 
OPTIONAL MATCH (product)<-[:TAGS]-()<-[:CHILD*0..]-(tag) 
RETURN product, collect(tag) as tags 

Hier ist die 0 wird unter Berücksichtigung der Fall, in dem die Tags nicht über die Eltern und die () in der tags Sammlung einbetten.

Ich empfehle Ihnen die folgenden liest für die Modellierung und Cypher Teile, ich bin sicher, dass jemand eine Antwort für die SDN Seite hinzufügen kann.

http://graphaware.com/neo4j/2013/10/11/neo4j-bidirectional-relationships.html

http://graphaware.com/graphaware/2015/05/19/neo4j-cypher-variable-length-relationships-by-example.html

+0

Danke Christopher. (Tag) - [: KIND] -> (Tag) - [: KIND] -> (Tag) ist genau der Fall, den ich klären musste. BTW Links waren sehr, sehr nützlich! Dank dafür ! – Lina