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