【问题标题】:Neo4J - CQL - How to match exactly this pattern?Neo4J - CQL - 如何完全匹配这种模式?
【发布时间】:2019-05-21 19:34:19
【问题描述】:

我正在使用 Neo4J 图形数据库。

我有两个节点标签:

  • :个人(用户)
  • :事件(用户创建的事件:与地点、开始日期、客人...)

还有 2 种关系类型:

  • :IS_INVITED_TO
  • :IS_INVITED_BY

为简单起见,我已将查询简化到最低限度。

这里是查询:

MATCH (user:Person {guid: $userGuid})-[:IS_INVITED_TO]->(event:Event) 
WITH user, event 

MATCH (event)<-[:IS_INVITED_TO]-(user)-[:IS_INVITED_BY]->(invitor:Person) 
WITH user, event, collect(invitor) AS invitors 

RETURN {properties: properties(event), invite_by_nodes: invitors};

我想查找邀请当前用户的所有事件(第 1 行:工作正常)。

对于每个活动,我想知道谁邀请了我(第 3 行:不起作用,它返回邀请我参加其他活动的邀请者,而不是当前活动)。

我很确定第 3 行的模式不正确: 它找到(用户),但忽略(事件)。因此,查询返回邀请我参加某个活动(不是当前活动)的所有邀请者。

我之前也尝试过很多事情来发布(丢失了 3 天..):

  • UNWIND collect(event) AS 事件(在第一个 MATCH 和 WITH 之后):与当前事件迭代一起工作
  • 添加 WHERE 子句以强制查找当前事件
  • 我在 Neo4J 的文档/stackoverflow 上到处搜索

帮助将不胜感激! 非常感谢:-)

【问题讨论】:

  • 只有像 (user)-[:IS_INVITED_BY]-&gt;(r:Person) 这样的架构,我不明白如何将 IS_INVITED_BY 与事件联系起来......
  • @logisima 我也试过这个模式:(event)&lt;-[:IS_INVITED_TO]-(user)-[:IS_INVITED_BY]-&gt;(invitor:Person)-[:CREATOR|IS_INVITED_TO]-&gt;(event) 为了简单起见,我没有发布它。这样我可以将IS_INVITED_BY 与事件联系起来?
  • 不...您的活动已与许多用户共享,因此您不知道链接IS_INVITED_BY 是给谁的!

标签: neo4j cypher


【解决方案1】:

在你的项目中,似乎邀请是很重要的东西,所以它必须是一个节点。

你的模型应该是:

(:User)-[:HAS_INVITATION]->(i:Invitation)-[:FOR_EVENT]->(:Event),
(i:Invitation)-[:COMES_FROM]->(:User)

所以你的查询将变成:

MATCH 
  (user:User {guid: $userGuid})[:HAS_INVITATION]->(i:Invitation),
  (i)-[:COMES_FROM]->(invitor:User),
  (i)-[:FOR_EVENT]->(e:Event)
RETURN e, invitor

【讨论】:

  • 我必须更改我的架构才能进行测试。我会及时通知您,如果是,我会标记为已解决。谢谢 ;-) 如果其他人有其他解决方案?
  • 这是一个很好的解决方案,通过使用这个中间节点,它保留了邀请者、被邀请者和相关事件的上下文,而原始模型中缺少这些上下文(没有明确的上下文/关系邀请者和活动)。
  • 这个模型完美运行!谢谢,圣诞快乐 :-)
猜你喜欢
  • 2015-11-01
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-12
相关资源
最近更新 更多