2016-12-13 20 views
0

我试图将任务(我称他们为“todos”,因为“任务”采取)给我组织的每位新员工。有几个事件围绕着todos进行组织,一些todos有相关的文档。如何复制我设置为模板的节点和关系,并将新实例信息应用于副本?

enter image description here

现在我需要帮助搞清楚如何能一个暗号查询,将创建各种待办事项的新版本(以及任何相关文件),并将其分配给新员工。

其他信息:每个新员工都有一个人力资源人员分配给他们,对于每个任务的新实例,该任务被“分配到”新员工以及人力资源人员的“assigned_by”。

下面是一些暗号伪代码:

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,我需要将同一文档(此处没有实例或模板)附加到新实例。

我猜这将使用路径和放松,我找了教程,但我没有太多的运气。任何帮助,非常感谢。

最后,我使用neo4j 2.2.9,但如果有必要,我可以升级它。

回答

0

我不认为你需要复制每个新雇用的模板。相反,每个新员工都可以与每个(现有的)节点具有关系,与他/她相关。如果您必须为每个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); 

在这个例子中,我在每个HAS_TO_DO关系存储在其相关的任务分配的时间。请注意,不需要对可选文档进行任何明确的操作。

+0

这是一个好主意,也是我之前玩过的一个主意。我应该在我的问题中提到,我希望在其他情况下再次使用这些ToDos,并且在那一点上,他们可能会有不止一个人分配给他们。在这种情况下,更有意义的是在单个任务上具有状态=“关闭”的数据,而不是(可能)多重关系。 – Daniel

0

我做到了。它的工作原理是因为我使用WITH来打包原始ToDos与文档之间的任何关系,然后在另一个集合中收集这些todos及其文档。然后,使用展开和/或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) 
相关问题