Neo4J-CQL-如何精确匹配此模式?

时间:2018-12-21 10:16:58

标签: neo4j cypher

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

我有两个节点标签:

  • :人员(用户)
  • :事件(用户创建的事件:包含地点,startDate,访客,...)

和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中搜索

我们将不胜感激! 非常感谢:-)

1 个答案:

答案 0 :(得分:2)

在您的项目中,邀请似乎很重要,因此邀请必须是节点。

您的模型应该是:

(: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