查找具有所有公共中介的节点

时间:2013-02-02 00:25:21

标签: neo4j cypher

我正在创建一个系统,我们将ordersstaff匹配。从概念上讲,order是要求某人完成某项工作的请求,而staff是指能够完成这项工作的人。 order可以有一个或多个requirements(即限制谁可以开展工作),staff可以再增加一个requirements(即可以开展工作的资格) )。

我正在尝试创建一个密码查询,该查询将为我提供所有staff,其中所有由给定requirement列出的order。换句话说,我正在尝试查找与每个staff节点相关的所有requirement个节点,这些节点与给定的order节点相关。 我的问题是:如何创建一个cypher查询来为该业务逻辑建模?

例如,请考虑以下示例数据:

查看 orderId:1 节点。它与两个节点有requires关系,标记为 RN ER IV 。换句话说,#1号令要求任何申请人具有RN资格和ER IV资格。事实上,工作人员 Evan staffId:1 )具有这两种资格,因此他应该能够申请该工作。工作人员 Tim 有其中一项要求,但不是两者,所以他不应该申请这项工作。此外, orderId:2 只有一个要求,Evan和Tim都有,所以他们都应该能够申请这项工作。

所以从本质上讲,如果我从订单#1开始,我会想要只回到Evan。如果我从订单#2开始,我会想要回到Evan和Tim *。

以下查询是中途的一半。它将为我提供从给定订单到工作人员一次一个要求的所有独特路径。但是,它不会检查是否满足每个需求路径(这意味着它目前仅适用于只有一个需求的订单):

start o=node(2) 
match o-[:requires]->req<-[:hasRequirement]-s 
return o, req, s;

那么我的选择是什么?我可以以某种方式检查是否存在未知数量的匹配关系?或者我需要以不同的方式对数据建模吗?

* 编辑:我在设置示例数据时犯了一个错误。 Tim 应与 RN 相关联,以便他有资格获得#2号订单。

2 个答案:

答案 0 :(得分:6)

我想这个cypher声明解决了你的问题:

start o=node(2) 
match o-[:requires]->req<-[:hasRequirement]-p 
with o, p, count(req) as c 
where length(o-[:requires]-()) = c 
return p, c

答案 1 :(得分:3)

我想出了

start o=node(2) 
match o-[orderReqRel:requires]->r 
with count(orderReqRel) as orderReqs, o 
match p-[personReqRel:hasRequirement]->r<-[:requires]-o 
with count(personReqRel) as personReqs,p,orderReqs 
where personReqs=orderReqs
return p;

似乎在订单1工作,我只回到Evan。 订单2似乎没有Tim的要求(您的解释表明但由于某种原因,在您分享的控制台中没有看到它)