2016-07-10 41 views
0

我正在使用的Neo4j图形数据库,我想知道什么是对这种情况进行建模的最佳方式:您将如何建模这个非关系数据库?

PERSON1>告诉>报价>到> PERSON2>谁告诉了 - > Person3可能 - >谁告诉它到 - > Person4>谁告诉它 - > Person1

我想过引用是链接的一个属性。但是,也许报价也需要成为一个节点。在这种情况下,边缘将被“告知”和“被误解”。像:

PERSON1 - >创建>报价 引用属性:id,文字 人属性:ID,名称

PERSON2>说:{到:人3}>报价 Person3可能> was_told:{方式: PERSON2}>报价

或:

Person3可能>说:报价> PERSON1

什么是使用这个数据库模型的最佳方法?

+1

这是一个非常有趣的问题。您可以添加您期望执行的查询和操作类型(只是一般性描述,而不是密码或伪代码)?这可能会增加一种建模的重量。 – InverseFalcon

回答

3

我认为你需要以下模型:

  • 片段(谈话)的对话(包括时间)
  • 谁是这个片段
  • 的扬声器谁是观众该片段
的该片段
  • 内容(报价)

    例如,这里的code创建的第一个片段:

    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) 
    

    可视化:

    enter image description here

    的报价的整个生命周期中的查询:

    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

    提取对话(或对话甚至是共享)节点绝对是一种正确的解决方案。我认为唯一可能遗漏的是会谈之间的关系,例如(talk1)< - [:SharedFrom] - (talk2)等。这样,如果有多个谈话链(或谈话树,如果您允许一个人与多个人分享而不是一个人),您可以识别并找到每个关于报价的链,或者通过链来追踪。 – InverseFalcon