我需要获取层次结构的 JSON 树(或某些层次结构,如果此模式有不同的根 - 因为我的示例中的 ```ps`` 是路径列表),我可以通过以下方式实现:
MATCH p=(parent)-[:metaClassOf*]->(child)
WHERE NOT (parent)<-[:metaClassOf]-()
WITH COLLECT(p) AS ps
CALL apoc.convert.toTree(ps) yield value
RETURN value;
如果我只需要查询层次结构的一部分,我可以指定所需的叶子作为查询中的根:
MATCH (root {name: "The Root Name"})
MATCH p=(root)-[:metaClassOf*]->(child)
WHERE NOT (root)<-[:metaClassOf]-()
WITH COLLECT(p) AS ps
CALL apoc.convert.toTree(ps) yield value
RETURN value;
但是如何从最后一个查询中排除
root
节点本身,因为我不希望它出现在最终的 JSON 树中?我会重复一遍,我需要来自根节点的路径列表,但没有这个根节点,然后将它们转换为 JSON 树。
我无法通过过滤
UNWIND
路径之后的节点来实现这一点,因为我不知道如何将它们组合回能够使用 apoc.convert.toTree(ps)
的路径列表,然后:
MATCH (root {name: "The Root Name"})
MATCH p=(root)-[:metaClassOf*]->(C_Child)
WHERE NOT (root)<-[:metaClassOf]-()
UNWIND nodes(p) as ns
WITH ns as nss
WHERE NOT nss.name= The Root Name"
return nss
此查询返回每个
subtree
的每个 root
(没有根节点),其 name
是“根名称”。
MATCH (root {name: "The Root Name"})-[:metaClassOf]->(n)
WHERE NOT ()-[:metaClassOf]->(root)
MATCH p=(n)-[:metaClassOf*0..]->()
WITH root, COLLECT(p) AS ps
CALL apoc.convert.toTree(ps) YIELD value AS subtree
RETURN root, subtree