我应该如何在neo4j中表示任务和子任务?

时间:2018-05-29 16:56:57

标签: neo4j cypher

我试图决定一个好的数据模型来表示任务和子任务。这是一个两部分问题:

首先,我希望能够获得一系列任务(task1) - [:NEXT] - >(task2) - [:NEXT] - >(task3)等。我希望能够从第一个开始收集它们并按顺序显示它们。密码很简单......就像

p = match(first:Task)-[:NEXT*]->(others:Task)
return o.name, o.instructions
order by length(p) // or something like this, probably with a union to get both the first task and other tasks in the same output

但是,我也想让一个子任务有孩子。例如,我可能会有一系列任务构成"如何制作咖啡"但是当我创建一组任务构成"如何制作早餐" ,我想指出"如何制作咖啡"任务集并重复使用它们。

让cypher返回交错列表(例如1,1.1,1.1.1,2等)会很好,但我实际上只对1,2,3等同样感到高兴。 .n。

我一直在寻找并且没有在任何地方找到明确的解决方案。这是我想象的图片。任何方向,想法或参考都非常感谢。

Tasks numbered kind of how I'd like to be able to retrieve them

1 个答案:

答案 0 :(得分:0)

我将重新使用answer来解决另一个问题,但它确实是解决此问题的最佳方法。您遇到的问题是,一旦您有多个不同但相交的路径,您的方案就会开始崩溃。因此,您最终会尝试破坏数据以尝试解决生成的冲突。

1)对于每个链,创建一个节点来表示该链。

2)创建从该节点到链中每个节点的关系,并在关系上添加索引属性。

3)改为在“链”节点上运行Cyphers。

为您的案例展开上述内容......

在这种情况下,链节点表示必须按顺序完成的任务列表;它本身也可以成为一项任务。将列表与任务分开是更多工作,但它允许您定义多种方法来完成某项任务。例如,我可以通过启动我的咖啡机来制作咖啡,要求Google制作它(它将启动机器),或者去星巴克。这应该足够灵活,以支持您需要表示的任何内容,而不会在每个实例上践踏。这里的关键部分是关系也可以拥有属性!不要害怕用它来区分它们。 (你可以在每个任务链中添加一个'group-id'来区分它们,但这会产生扩展问题)