3

に一致するシステムを作成していordersますstaff。概念的には、anorderは人に何らかの仕事をするように要求し、astaffはその仕事をすることができる人です。orderは1つ以上requirements(つまり、誰が仕事をすることができるかについての制限)を持つことができ、もう1つ(つまり、仕事をする資格)をstaff持つことができます。requirements

私は、与えられたによってリストされたすべてstaffを持っているすべてを私に与える暗号クエリを作成しようとしています。別の言い方をすれば、特定のノードに関連するすべてのノードに関連するすべてのノードを見つけようとしています。私の質問は、そのビジネスロジックをモデル化するための暗号クエリを作成するにはどうすればよいですか?requirementorderstaffrequirementorder

例として、次のサンプルデータについて考えてみます。

orderId:1ノードを見てください。RNおよびERIVrequiresというラベルの付いた2つのノードと関係があります。つまり、注文番号1では、申請者はRN資格とERIV資格を持っている必要があります。たまたまスタッフのエヴァンstaffId:1)が両方の資格を持っているので、彼はその仕事に応募できるはずです。スタッフのティムには、これらの要件の1つがありますが、両方はありません。そのため、彼はその仕事に応募できないはずです。さらに、orderId:2にはEvanとTimの両方が持っている要件が1つしかないため、両方がそのジョブに申し込むことができるはずです。

つまり、基本的に、注文番号1から始める場合は、エヴァンだけを取り戻したいと思います。注文番号2から始める場合は、エヴァンとティム*を取り戻したいと思います。

次のクエリは途中です。それは私に与えられた注文からスタッフメンバーへのすべてのユニークな道を一度に一つの要件を与えてくれます。ただし、すべての要件パスが満たされているかどうかはチェックされません(つまり、現在、要件が1つしかない注文に対してのみ機能します)。

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

だから私のオプションは何ですか?不明な数の一致する関係の存在をどうにかして確認できますか?または、データを別の方法でモデル化する必要がありますか?

*編集:サンプルデータの設定を間違えました。ティムは、注文#2の資格を得るために、 RNに関連付けられている必要がありました。

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 に答える