2016-07-13 6 views
0

Eine Beziehung einen Fall von, sagen wir, „Freunde“ auf einer Social-Networking-Plattform in der Regel als modelliert werden würde beteiligt: ​​Soll ich in diesem Fall eine einzelne Beziehung oder zwei Beziehungen verwenden?

(x:User)-[:FRIEND]->(y:User) 

, die dann als abgerufen wird:

MATCH (x:User)-[:FRIEND]-(y:User) RETURN x, y 

Nun lassen Sie uns sagen, für eine bestimmte x und y: obwohl sie Freunde sind, vertraut y nicht wirklich x; x fühlt sich nicht so über y obwohl.

also aus der Perspektive der y, tatsächlich das Datenmodell ist:

(y)-[:FRIEND {untrusted: true}]->(x) 

jedoch aus der Sicht der x, das ist nicht, wie die Dinge aussehen:

(x)-[:FRIEND]->(y) 

So etwas so wäre das zum Erstellen der Beziehung eindeutig ungeeignet:

MATCH (x:User {...}), (y:User {...}) MERGE (x)-[f:FRIEND]->(y) SET f.untrusted = true 

... denn jetzt, die Dinge am Ende so aussehen aus der Perspektive der beiden Benutzer:

(x:User {...})-[:FRIEND {untrusted: true}]->(y:User) 
(x:User {...})<-[:FRIEND {untrusted: true}]-(y:User) 

Die allgemeine Beratung ist in der Regel auf zwei diskrete Beziehungen in den meisten Fällen zu verhindern, aber wie soll ich gehen über diesen Fall einer Beziehung modellieren?

Antwort

1

Die Beziehungen in Neo4j sind immer gerichtet, aber wie Sie sehen, müssen Sie beim Abfragen nicht unbedingt eine Richtung angeben.

Ich denke in diesem Fall ist es hilfreich, mit einem Twitter-Modell zu vergleichen, wo Benutzer anderen Benutzern "folgen". Das folgende ist nicht notwendigerweise reziprok:

bedeutet nicht, dass Barack Obama Will folgt zurück.

Ich denke, dies ist konsistenter mit Ihrem Datenmodell und in diesem Fall ist nichts falsch mit Beziehungen in beiden Richtungen zu erstellen.