我正在使用Neo4j创建一个图形数据库,我想知道对这种情况建模的最佳方法是什么:
Person1>告诉>引用>到> Person2>谁告诉它 - > Person3 - >谁告诉它 - > Person4>谁告诉它 - > PERSON1
我认为引用是链接的属性。但是,也许引用也需要成为一个节点。在这种情况下,边缘将被“告知”和“was_told”。像:
Person1 - >创建>引用 引用属性:id,text 人物属性:id,name
Person2>告诉:{to:Person 3}>引用 Person3> was_told:{by:Person2}>报价
或:
Person3>告诉:引用> PERSON1
用于建模此数据库的最佳方法是什么?
答案 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)
可视化:
报价的整个生命周期的查询:
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