你会如何模拟这个非关系型数据库?

时间:2016-07-10 04:04:32

标签: graph neo4j

我正在使用Neo4j创建一个图形数据库,我想知道对这种情况建模的最佳方法是什么:

Person1>告诉>引用>到> Person2>谁告诉它 - > Person3 - >谁告诉它 - > Person4>谁告诉它 - > PERSON1

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

Person1 - >创建>引用 引用属性:id,text 人物属性:id,name

Person2>告诉:{to:Person 3}>引用 Person3> was_told:{by:Person2}>报价

或:

Person3>告诉:引用> PERSON1

用于建模此数据库的最佳方法是什么?

1 个答案:

答案 0 :(得分: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