2016-07-10 16 views
0

Ich erstelle eine Graph-Datenbank Neo4j mit und ich frage mich, was der beste Weg ist, diesen Fall zu modellieren:Wie würden Sie diese nicht-relationale Datenbank modellieren?

Person1> gesagt> quote> zu> Person2> wer es gesagt -> Person3 -> wer es gesagt zu -> Person4> Wer hat es gesagt -> Person1

Ich habe über Zitat als ein Attribut der Verbindung gedacht. Aber dann muss Zitat vielleicht auch ein Knoten sein. In diesem Fall würden die Kanten "erzählt" und "was_told" sein. Wie:

Person1 -> erstellt> Zitat Zitat Attribute: id, Text Person Attribute: ID, Name

Person2> sagte: {zu: Person 3}> quote Person3> was_told: {von: Person2}> Zitat

oder:

Person3> gesagt: quote> Person1

Was ist der beste Ansatz zu verwenden, um diese Datenbank zu modellieren?

+1

Diese ist ein ziemlich interessantes Problem. Können Sie die Art von Abfragen und Operationen hinzufügen, die Sie erwarten (nur eine allgemeine Beschreibung, nicht in Cypher oder Pseudocode)? Das könnte einer Art von Modellierung gegenüber einer anderen mehr Gewicht verleihen. – InverseFalcon

Antwort

3

Ich glaube, Sie brauchen das folgende Modell:

  • Ein Fragment (Diskussion) eines Gesprächs (einschließlich der Zeit)
  • Wer ist der Sprecher dieses Fragment war
  • Wer war ein Publikum von dieses Fragment
  • Inhalt (Zitat) dieses Fragments

Zum Beispiel, hier ist die code für das erste Fragment zu schaffen:

MERGE (P1:Person {name:'Person1'}) 
MERGE (P2:Person {name:'Person2'}) 
MERGE (Q:Quote {name:'Quote1', text:'Quote1 text'}) 
MERGE (P1)<-[:has_speaker]-(T1:Talk {name:'Talk1', time: 1})-[:has_audience]->(P2) 
MERGE (T1)-[:talk_about]->(Q) 

Visualisierung:

enter image description here

Die Abfrage für den gesamten Lebenszyklus eines Zitats:

MATCH (Q:Quote {name:'Quote1', text:'Quote1 text'})<-[:talk_about]-(T:Talk) 
WITH Q, T 
MATCH (P1:Person)<-[:has_speaker]-(T)-[:has_audience]->(P2) 
WITH Q, T, P1 as speaker, collect(P2.name) as audience ORDER BY T.time ASC 
RETURN Q as quote, 
     collect({time: T.time, 
       speaker: speaker.name, 
       audience: audience} 
     ) as quoteTimeline 
+1

Das Extrahieren eines Diskussions- (oder Konversations- oder sogar Shared-) Knotens scheint definitiv die richtige Lösung zu sein. Ich denke, das einzige, was vielleicht fehlt, ist eine Beziehung zwischen den Gesprächen, etwas wie (talk1) <- [: SharedFrom] - (talk2) und so weiter. Auf diese Weise können Sie, wenn es mehrere Gesprächsketten gibt (oder Sprechbäume, wenn Sie einer Person erlauben, mit mehreren Personen statt nur einer Person zu teilen), jede Kette über ein Zitat identifizieren oder finden oder eine Kette verfolgen. – InverseFalcon

Verwandte Themen