Graph 您将如何为这个非关系数据库建模?

Graph 您将如何为这个非关系数据库建模?,graph,neo4j,Graph,Neo4j,我正在使用Neo4j制作一个图形数据库,我想知道对这种情况进行建模的最佳方法是什么: Person1>告诉>引用>给>人2>谁告诉它->人3->谁告诉它->人4>谁告诉它->人1 我认为引用是链接的一个属性。但也许quote也需要是一个节点。在这种情况下,边缘将被“告知”和“告知”。比如: Person1->已创建>报价 报价属性:id,文本 个人属性:id、姓名 Person2>告诉:{to:person3}>引用 有人告诉我:{by:Person2}>quote 或: 人员3>告知:报价>人

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

Person1>告诉>引用>给>人2>谁告诉它->人3->谁告诉它->人4>谁告诉它->人1

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

Person1->已创建>报价 报价属性:id,文本 个人属性:id、姓名

Person2>告诉:{to:person3}>引用 有人告诉我:{by:Person2}>quote

或:

人员3>告知:报价>人员1


为这个数据库建模的最佳方法是什么

我认为您需要以下型号:

  • 谈话的片断(谈话)(包括时间)
  • 谁是这个片段的演讲者
  • 谁是这个片段的观众
  • 此片段的内容(引用)
例如,下面是创建第一个片段的步骤:

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)
MERGE(P1:Person{name:'Person1'})
合并(P2:Person{name:'Person2'})
合并(Q:Quote{name:'Quote1',text:'Quote1 text'})
合并(P1)(P2)
合并(T1)-[:谈论]->(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

MATCH(Q:Quote{name:'Quote1',text:'Quote1 text'})我认为您需要以下模型:

  • 谈话的片断(谈话)(包括时间)
  • 谁是这个片段的演讲者
  • 谁是这个片段的观众
  • 此片段的内容(引用)
例如,下面是创建第一个片段的步骤:

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)
MERGE(P1:Person{name:'Person1'})
合并(P2:Person{name:'Person2'})
合并(Q:Quote{name:'Quote1',text:'Quote1 text'})
合并(P1)(P2)
合并(T1)-[:谈论]->(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

MATCH(Q:Quote{name:'Quote1',text:'Quote1 text'})这是一个非常有趣的问题。您能否添加您希望执行的查询和操作类型(只是一般描述,而不是密码或伪代码)?这可能会增加一种建模的权重,而不是另一种。这是一个非常有趣的问题。您能否添加您希望执行的查询和操作类型(只是一般描述,而不是密码或伪代码)?这可能会增加一种建模的权重,提取一个对话(或对话,甚至是共享)节点显然是正确的解决方案。我认为唯一可能缺少的是对话之间的关系,比如(talk1)提取对话(或对话,甚至共享)节点似乎是正确的解决方案。我认为唯一可能遗漏的是会谈之间的关系,比如(会谈1)