2016-12-13 3 views
0

私は自分の組織の新しい従業員それぞれにタスクを割り当てようとしています(「タスク」が取られているので「todos」と呼んでいます)。 todosが整理されているいくつかのイベントがあり、いくつかのtodosには関連するドキュメントがあります。テンプレートとしてセットアップしたノードとリレーションシップをコピーし、コピーに新しいインスタンス情報を適用するにはどうすればよいですか?

enter image description here

今私はどのように(どの関係書類と一緒に)ドスのそれぞれの新しいバージョンを作成し、新規雇用に割り当てますCYPHERクエリを缶に考え出す助けが必要です。

その他の情報:新しい人員にはそれぞれ人事担当者が割り当てられており、各タスクの新しいインスタンスに対しては、新しい人材には「割り当てられ」、人員には「assigned_by」割り当てられます。

は、ここではいくつかのCYPHER擬似コードです:

match(newHire:Person {name:"Jane Doe"})-[:HAS_HR_CONTACT]->(hrContact:Person) 
with newHire, hrContact 
match(firstDay:MetaEvent {name:"First Day"})<-[:RELEVANT_TO]-(task:ToDo) 
optional match (task)-[:HAS_DOCUMENT]->(doc:Document) 
with newHire, hrContact, task, doc 
//... and now I'm lost 

私は何を知っている必要がありますが、テンプレートのToDoの性質を取り、それらを新しいインスタンスにコピーする方法です。次に、ToDoテンプレートに添付されたドキュメントがある場合は、同じインスタンスを新しいインスタンスに追加する必要があります(インスタンスまたはテンプレートはここにありません)。

私はこれがパスを使い、リラックスして、私はチュートリアルを探しましたが、私はあまり運がないと思っています。どんな助けでも、大いに感謝します。

最後に、neo4j 2.2.9を使用していますが、必要に応じてアップグレードすることができます。

答えて

0

新入社員ごとにテンプレートをコピーする必要はありません。代わりに、それぞれの新規採用者は、それぞれ(既存の)ToDoノードとの関係を持つことができます。 ToDoごとに個人特有の情報を格納する必要がある場合は、それを関係のプロパティに格納することができます。例えば

:この例では

MATCH (newHire:Person {name:"Jane Doe"}) 
MATCH (:MetaEvent {name:"First Day"})<-[:RELEVANT_TO]-(task:ToDo) 
CREATE (newHire)-[:HAS_TO_DO {time_assigned: timestamp()}]->(task); 

、Iは各HAS_TO_DO関係に関連するタスクが割り当てられた時刻を格納します。オプションの文書で明示的に何もする必要はないことに注意してください。

+0

これは良いアイデアであり、以前のものとおもしろいものです。私は私の質問で、これらのToDosを他の文脈で再び使用したいと願っていたはずです。その時点で、複数の人が割り当てられている可能性があります。その意味では、(潜在的に)複数の関係ではなく、個々のタスクでstatus = "closed"のようなデータを持つ方が意味があります。 – Daniel

0

私はこれを行いました。これは、ToDosオリジナルのドキュメントとの関係をパッケージ化し、別のコレクションのToDosとそのドキュメントを収集するためにWITHを使用するために機能します。それから、すべてをループするために巻き戻しやforeachを使うのはかなりシンプルです。コレクションの作成時に{}表記を使用すると便利です。

// get the template tasks associated with the event 
MATCH (e:MetaEvent {name:"First Day"})<-[:RELEVANT_TO]-(td:ToDo) 
// If they have documents, get those too 
OPTIONAL MATCH (td)-[docRel:HAS_DOCUMENT]->(d:Document) 
// get the event, and todos, and collect the documents 
WITH e, td, collect(d) as documents 
// get the event and collect the tasks along with any documents 
WITH e, collect ({todo:td, taskDocs:documents}) as tasks 
// match the person 
MATCH (newHire:Person {name:"John Doe"})-[:HAS_HR_GENERALIST]->(generalist:Person) 
// not sure you need this ... 
WITH e, newHire, generalist, tasks 
// use unwind to loop through all the collected tasks 
UNWIND tasks as task 
// create a new copy of each task and set any particular properties 
CREATE (ntd:ToDo {title:task.todo.title}) 
SET ntd.event = e.name 
// for any document attached to the original template todo, create a similar relationship with the new todo (ntd) 
FOREACH(d in task.taskDocs | 
    MERGE (ntd)-[:HAS_DOCUMENT]->(d) 
) 
// Finally ... assign the new todo to the people it needs to be attached to 
merge (generalist)<-[:ASSIGNED_BY]-(ntd)-[:ASSIGNED_TO]->(newHire) 
関連する問題