我正在创建一个系统,我们将orders
与staff
匹配。从概念上讲,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号订单。
答案 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的要求(您的解释表明但由于某种原因,在您分享的控制台中没有看到它)