图形数据库 - 如何从关系中引用节点

时间:2015-07-01 11:47:21

标签: neo4j cypher graph-databases

我正在准备一个图形数据库(使用neo4j)来处理这种社交网络场景:

  • 用户可以发布到他们的墙上,与特定用户共享帖子
  • 用户可以将消息发送给他人
  • 消息可以是文字或"链接"到发布

所以我提出了以下想法:

用户和帖子是图表的节点。当用户A创建与PB共享的帖子C时,会创建以下关系:A-[:posted]->pp-[:shared_with]->B以及p-[:shared_with]->CPost数据(id,text,date)存储为:posted关系的属性。

对于类似的消息:例如A-[:messaged]->C

现在,如果我想在邮件中分享帖子,请在post_id属性中加入:messaged。它允许我通过单个Cypher查询提取所有消息(连同帖子链接):

match (a:User) match (b) where a.username = "C" match a-[m:messaged]-b 
optional match (x:User)-[p:posted]->(post:Post)
where post.id = m.post_id
return distinct
m.post_id,
  startnode(m).username as from, 
  endnode(m).username as to ,
  x.username as PostAuthor,
  case x when null then "Message" else "Pulled Post" end as Type,
  case x when null then m.text else post.text end as Text, 
  m.date
order by m.date asc

虽然它对我来说并不是看起来 - 因为在图表上Post和消息之间没有视觉联系。但是,我无法在Node和Relation之间建立关系,对吗?我该怎么做才能正确设计呢?

1 个答案:

答案 0 :(得分:1)

在post和message都是节点的模型中,您的查询将如下所示:

match (a:User)<-[:FROM]-(m:Message)-[:TO]->(b:User) 
where a.username = "C" 
match (m)<-[:COMMENT]-(post:Post)<-[:POSTED]-(x:User)
return distinct
  m.id,a as from, b as to,
  x.username as PostAuthor,
  case x when null then "Message" else "Pulled Post" end as Type,
  case x when null then m.text else post.text end as Text, 
  m.date
order by m.date asc