我有一个查询,它从一个特定的:Person开始,并使用一些不同的关系遍历方法,收集所有感兴趣的人:人员节点在一起(明显地),并为每个人返回一个公共数据集:人
其中一条数据反映了这种关系的模式或类型,我试图弄清楚是否有办法设置一个标志来表明我发现的关系:那种关系中的人,即使在我收集,添加,放松和区分那些人员时,保留该旗帜:人物。
作为一个简单的例子,我有直接的:朋友关系:人,这些很容易收集。我还有一个:WorkPlace节点,一个人:WorksAt。我用它来找到我的同事,他们是:同样的人:同样的工作:WorkPlace。
我想要一种结合两种结果的方法:人们获得一个独特的集合(我的所有朋友与我的所有同事合并,如果a:Person既是朋友又是同事,则没有重复)。 Union不会帮助我,因为它不允许对结果进行后处理。相反,我分别收集两组:来自子查询的人,将它们加在一起,使它们全部在同一个列表中,展开它们,并获得不同的行。这对我来说已经有用了。
此时我现在拥有了所有:我感兴趣的人,我可以启动子查询来获取他们可能拥有的其他数据节点,我想要包含在每个输出Person行中。
但是,其中一个数据是布尔值,如果:Person是同事。为了得到这个,我重复其中一个收集查询的一部分来检查这种关系(这样做:Person工作在同一个:WorkPlace我做什么?)并将其存储为输出的布尔值。
这很好......但我觉得我正在做额外的工作,当我做初始匹配并第一次找到那些同事时,应该有一些标记和保留isCoworker布尔值的方法。理想的做法是将这个标志附加到节点的某个地方,因此它可以在collectes()中存活并展开......但我不知道如何做到这一点。即使我可以做到这一点,我也不认为它会在DISTINCT运营商中存活下来(同样的:人被发现为:朋友,那个国旗不会出现,我可能会有另一面旗帜, isFriend,我想要结合起来,结果是:Person会有两个标志存在)。同样,我也不认为这样一个单独创建的旗帜可以在所有这些操作中存活下来。
有没有其他人遇到(并希望解决)这类问题?
编辑:
添加查询的简化版本。
MATCH (me:Person{id:777})
WITH me
OPTIONAL MATCH (me)-[:Friend]-(friend:Person)
WITH me, collect(friend) AS friends
OPTIONAL MATCH (me)-[:WorksAt]->[:WorkPlace]<-[:WorksAt]-(coworker:Person)
WHERE coworker <> me
WITH friends + collect(coworkers) AS everyone
UNWIND everyone AS acquaintance
WITH DISTINCT acquaintance
// ...
WITH acquaintance
OPTIONAL MATCH (meAgain:Person{id:777})-[:WorksAt]->(:WorkPlace)<-[r:WorksAt]-(acquaintance)
WITH meAgain, acquaintance, r IS NOT NULL AS isCoworker
OPTIONAL MATCH (meAgain)-[r:Friend]-(acquaintance)
RETURN acquaintance, isCoworker, r IS NOT NULL AS isFriend
同样,这是简化的。在...我收集任何人共同的数据:Person对象,并且在查询的其余部分中省略了该数据的传递和使用以及输出,因为它与我的问题无关。还有几种收集方式:人,而不仅仅是这两个简单的例子。
这是可选的比赛,我试图通过某种方式保持类似的标志(isCoworker,isFriend),但在我匹配这些时创建:人员。这些标志必须能够在collectes(),list addition,unwinding和distinct操作中存活。
答案 0 :(得分:1)
您可以将第二个集合作为同事,并使用IN
进行检查,以便在需要的地方获取布尔值。
作为修改后的查询示例:
MATCH (me:Person{id:777})
WITH me
OPTIONAL MATCH (me)-[:Friend]-(friend:Person)
WITH me, collect(friend) AS friends
OPTIONAL MATCH (me)-[:WorksAt]->[:WorkPlace]<-[:WorksAt]-(coworker:Person)
WHERE coworker <> me
WITH friends, friends + collect(coworkers) AS everyone, collect(distinct coworker) AS coworkers
UNWIND everyone AS acquaintance
WITH DISTINCT acquaintance, coworkers, friends
// ...
WITH acquaintance, coworkers, friends
WITH meAgain, acquaintance, acquaintance IN coworkers AS isCoworker
RETURN acquaintance, isCoworker, acquaintance IN friends AS isFriend