3

我正在创建一个我们匹配的orders系统staff。从概念上讲,anorder是对某人做某项工作的请求,而 astaff是可以做该工作的人。一个order可以拥有一个或多个requirements(即限制谁可以从事这项工作),而一个staff可以拥有更多一个requirements(即从事工作的资格)。

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

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

查看orderId: 1节点。requires它与标记为RNER IV的两个节点有关系。换句话说,订单 #1 要求任何申请人都具有 RN 资格和 ER IV 资格。碰巧工作人员Evan ( staffId: 1 ) 具有这两种资格,因此他应该能够申请该工作。工作人员蒂姆有这些要求之一,但不是两者都有,所以他应该不能申请那份工作。此外,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。

4

2 回答 2

6

我想这个密码语句可以解决你的问题:

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
于 2013-02-02T14:11:55.680 回答
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。订单 2 似乎没有蒂姆的要求(您的解释表明,但由于某种原因,在您共享的控制台中没有看到它)

于 2013-02-02T14:11:45.713 回答