Graph 您将如何为这个非关系数据库建模?
我正在使用Neo4j制作一个图形数据库,我想知道对这种情况进行建模的最佳方法是什么: Person1>告诉>引用>给>人2>谁告诉它->人3->谁告诉它->人4>谁告诉它->人1 我认为引用是链接的一个属性。但也许quote也需要是一个节点。在这种情况下,边缘将被“告知”和“告知”。比如: Person1->已创建>报价 报价属性:id,文本 个人属性:id、姓名 Person2>告诉:{to:person3}>引用 有人告诉我:{by:Person2}>quote 或: 人员3>告知:报价>人员1Graph 您将如何为这个非关系数据库建模?,graph,neo4j,Graph,Neo4j,我正在使用Neo4j制作一个图形数据库,我想知道对这种情况进行建模的最佳方法是什么: Person1>告诉>引用>给>人2>谁告诉它->人3->谁告诉它->人4>谁告诉它->人1 我认为引用是链接的一个属性。但也许quote也需要是一个节点。在这种情况下,边缘将被“告知”和“告知”。比如: Person1->已创建>报价 报价属性:id,文本 个人属性:id、姓名 Person2>告诉:{to:person3}>引用 有人告诉我:{by:Person2}>quote 或: 人员3>告知:报价>人
为这个数据库建模的最佳方法是什么 我认为您需要以下型号:
- 谈话的片断(谈话)(包括时间)
- 谁是这个片段的演讲者
- 谁是这个片段的观众
- 此片段的内容(引用)
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)