2017-05-04 4 views
1

Ich weiß, dass Neo4j eine Beziehung Richtung zum Zeitpunkt der Erstellung erfordert, aber diese Richtung in der Abfragezeit ignorieren kann. Auf diese Weise kann ich mein Diagramm abfragen, ohne die Beziehungsrichtung zu beachten.Warum erlaubt neo4j keine direkte oder bidirektionale Beziehung zum Zeitpunkt der Erstellung?

Ich weiß auch, dass es einige Problemumgehungen für Fälle gibt, wenn die Beziehungen natürlich bidirektional oder nicht gerichtet sind, like described here.

Meine Frage ist: Warum ist es so implementiert? Gibt es einen guten Grund, nicht gerichtete oder bidirektionale Beziehungen zur Erstellungszeit zuzulassen? Ist es eine Einschränkung der Datenbankarchitektur?

CREATE()-[:KNOWS]-() 
CREATE()<-[:KNOWS]->() 

ich nach einer Antwort suchte im Internet, aber ich habe nicht viel finden:

Die Cypher Aussagen wie unten sind nicht erlaubt. Zum Beispiel this github issue.

Ist seltsam, eine Beziehungsrichtung zu einer zu definieren, die es nicht haben. Es scheint mir, dass ich die Semantik meines Graphen verletze.

EDIT 1:

Zu meiner Sicht zu einem "semantisches Problem" (vielleicht der Begriff ist falsch) zu klären:

Nehmen wir an, ich diese einfache CREATE Anweisung ausführen:

CREATE (a:Person {name:'a'})-[:KNOWS]->(b:Person {name:'b'}) 

Als Ergebnis habe ich diese sehr einfache Grafik:

Simple graph

Die :KNOWS-Beziehung hat nur eine Richtung, weil Neo4j zum Zeitpunkt der Erstellung eine Beziehungsrichtung benötigt. In meiner Domäne a kennt b und b kann a.

nun ein neues Teammitglied wird mein Graph mit dieser Cypher Abfrage abfragen:

MATCH path = (a:Person {name:'a'})-[:KNOWS]-(b:Person {name:'b'}) 
return path 

Das neue Teammitglied nicht wissen, dass, wenn ich diese Grafik habe ich der Auffassung, dass :KNOWS Beziehung nicht gerichtet ist. Das Ergebnis, dass er sehen wird, ist das gleiche:

Simple graph

durch das Ergebnis dieses neue Teammitglied vorstellen kann, dass nur Person ein weiß b Person betrachten. Es scheint mir schlecht zu sein. Nicht für dich? Das macht Sinn?

Antwort

2

Im Grunde geht es um die Interna, wie die Daten auf der Festplatte in Neo4j gespeichert werden - beachten Sie Kapitel 6 des O'Reilly Neo4j E-Book.

In der Datenstruktur einer Beziehung haben sie einen "firstNode" und einen "secondNode", wobei jeder entweder die linke oder die rechte Seite der Beziehung ist.

Um eine Beziehung als uni/bidirektional zu kennzeichnen, würde ein zusätzliches Bit pro Knoten erforderlich sein, wobei ich argumentiere, dass es besser ist, die Richtung im Datenspeicher beizubehalten und die Richtung während der Abfrage einfach zu ignorieren.

+0

Hallo @kuah! Ihre Antwort ist sehr nah an dem, was ich erwarte. Ich lese dieses Buch und werde das empfohlene Kapitel in naher Zukunft lesen! Vielen Dank! :) –

0

Es scheint mir, dass ich die Semantik meines Diagramms verletze.

Ich kann nicht sehen, warum ein < oder > Symbol während der Erstellung einer Beziehung verwendet, um die Semantik des Diagramms weh tut, wenn Sie nicht, dass das Symbol während der passenden (und damit diese Beziehung als ungerichtete/bidirektionale verwenden werden zur Behandlung von).

Angenommen, die von Ihnen vorgeschlagene Syntax wird unterstützt. Nun, wie werden Sie mit einer ungerichteten Beziehung verbinden zwei Knoten ein und b? Sie haben noch zwei Möglichkeiten:

  1. CREATE (a)-[:KNOWS]-(b)
  2. CREATE (b)-[:KNOWS]-(a)

Das Paar (a, b) wird immer durch Aussehen bestellt, auch wenn nicht von Semantik. Auch wenn wir das Symbol < oder > aus der Beziehungserklärung entfernen, kann das Problem mit der Reihenfolge der darin enthaltenen Knoten nicht beseitigt werden. Behandle es einfach nicht, es ist ein Problem.

+0

Hallo @Leon! Ich habe meine Frage bearbeitet, um meinen Standpunkt zu klären. Vielen Dank für Ihre Zeit! –

1

In Neo4j sind Beziehungen immer gerichtet.

Aber wenn Sie sich nicht um die Richtung kümmern, können Sie die Richtung bei der Abfrage ignorieren.

MATCH (p1:Person {name:"me"})-[:KNOWS]-(p2) 
RETURN p2; 

Und mit MERGE können Sie beim Erstellen auch die Richtung weglassen.

MATCH (p1:Person {name:"me"}) 
MATCH (p2:Person {name:"you"}) 
MERGE (p1)-[:KNOWS]-(p2); 

Sie brauchen nur 2 Beziehungen, wenn sie wirklich eine andere Bedeutung vermitteln, z. :FOLLOWS auf Twitter.

+0

Hallo @Michael Hunger. Danke für deine Antwort! Ja, ich habe verstanden, dass zum Zeitpunkt der Abfrage die Beziehungen ignoriert werden können. Meine Frage bezieht sich jedoch mehr auf "warum" Neo4j benötigt eine Richtung zum Zeitpunkt der Erstellung, wie von kwah beantwortet. –

Verwandte Themen