Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/295.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 具有文本结果的分层密码查询_Neo4j_Cypher - Fatal编程技术网

Neo4j 具有文本结果的分层密码查询

Neo4j 具有文本结果的分层密码查询,neo4j,cypher,Neo4j,Cypher,我的对象结构如下所示:有作为根节点的容器,它们有子容器。每个子容器都有任务,这些任务也有子任务。要在Cypher MATCH中对此进行插图说明: (容器)-[:HAS\u subcainer]->(subc)-[:HAS\u TASK]->(TASK)-[:HAS\u TASK]->(子任务) 我想编写一个查询,返回此层次结构的JSON文本表示: { name: 'Main', subcontainers: [ { name: 'Subcont', tas

我的对象结构如下所示:有作为根节点的容器,它们有子容器。每个子容器都有任务,这些任务也有子任务。要在Cypher MATCH中对此进行插图说明:

(容器)-[:HAS\u subcainer]->(subc)-[:HAS\u TASK]->(TASK)-[:HAS\u TASK]->(子任务)

我想编写一个查询,返回此层次结构的JSON文本表示:

{
  name: 'Main',
  subcontainers: [
    {
      name: 'Subcont',
      tasks: [
        {
          name: 'parent1',
          children: [
            {
              name: 'child1'
            }
          ]
        }
      ]
    }
  ]
}
有没有一种方法可以通过一个查询在Cypher中实现这一点?我找到了一个级别层次结构的解决方案:

MATCH (cnt:Container {name: 'Main'})-[:HAS_SUBCONTAINER]->(subcnt)
RETURN { name: cnt.name, subcontainers: EXTRACT(subc IN collect(subcnt)|{name: subc.name})}

但对于更复杂的情况,我们无法想出如何去做。有什么想法吗?

如果您知道匹配图案的深度,您可以在一系列集合中进行嵌套:

MATCH (container)-[:HAS_SUBCONTAINER]->(subcont)-[:HAS_TASK]->(task)-[:HAS_TASK]->(subtask)
WITH container, subcont, task, collect({name:subtask.name}) AS subtasks
WITH container, subcont, collect({name:task.name, children:subtasks}) AS tasks
WITH container, collect({name:subcont.name, tasks:tasks}) AS subconts
RETURN {
  name: container.name,
  subcontainers: subconts
} AS result
如果子任务是option(由@jim biard提出的问题),那么您需要一个可选的匹配项和一个case语句:

MATCH (container)-[:HAS_SUBCONTAINER]->(subcont)-[:HAS_TASK]->(task)
OPTIONAL MATCH (task)-[:HAS_TASK]->(subtask)
WITH container, subcont, task, collect(
  CASE subtask
  WHEN NULL THEN NULL
  ELSE { name:subtask.name }
  END
) AS subtasks
WITH container, subcont, collect({name:task.name, children:subtasks}) AS tasks
WITH container, collect({name:subcont.name, tasks:tasks}) AS subconts
RETURN {
  name: container.name,
  subcontainers: subconts
} AS result

所有任务都有子任务吗?这是一个非常好的图形列表,解释了如何将图形查询结果呈现到一个复杂的文档中:嗨,Michael。您的链接不起作用(您可以简化此操作:collect(当为NULL时为CASE subtask,然后为NULL,否则{name:subtask.name}END)作为子任务收集(subtask.name)作为子任务(NULL不收集,因为它是聚合函数)谢谢Chris,我昨天也提出了同样的解决方案,但忘了在这里发布。不过,另一个问题是:如果我们必须编写递归查询,以防子任务有子任务,而我们不知道这个层次结构的深度,该怎么办?是的,这在Cypher中不容易做到。您可能想看看其他API之一(或者可能)。