首页 > 解决方案 > Neo4J - CQL - 如何完全匹配这种模式?

问题描述

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

我有两个节点标签:

和 2 种关系类型:

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

这是查询:

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 天..):

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

标签: neo4jcypher

解决方案


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

你的模型应该是:

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

推荐阅读