繁体   English   中英

返回关系作为树中的子节点(Neo4j Cypher)

[英]Return relations as child nodes in tree (Neo4j Cypher)

有没有办法将关系作为树的子元素来检索?

这是我拥有的基本数据:

CREATE (:Customer {id:1, name:'Customer 1'})<-[:CREATED_BY]-(c:Category {id:1, name:'Category 1'})
WITH c as category, range(2, 7) as subCatIds
FOREACH (s IN subCatIds | CREATE (category)<-[:SUBCATEGORY_OF]-(:Category {id:s, name:'SubCategory '+s}))
WITH category, range(1, 5) as attTypeIds
FOREACH (a IN attTypeIds | CREATE (category)-[:HAS_ATTRIBUTE {name:'Attribute '+a, required: (a%2=0)}]->(:AttributeType {id:a, name:'AttributeType '+a}))
WITH category
MATCH p = (:AttributeType)<-[:HAS_ATTRIBUTE]-(category)<-[:SUBCATEGORY_OF]-(:Category)
RETURN p

因此,此查询正确返回树结构:

MATCH  (:Customer {id:1})<-[:CREATED_BY]-(c:Category {id:1}),
       p = (c)<-[:SUBCATEGORY_OF*0..1]-(:Category)
WITH COLLECT(p) as category
CALL apoc.convert.toTree(category) yield value
RETURN value

如何将关系[:HAS_ATTRIBUTE]作为子节点添加到此查询中?

我已经尝试过了:

MATCH  (:Customer {id:1})<-[:CREATED_BY]-(c:Category {id:1}),
       SubCatsP = (c)<-[:SUBCATEGORY_OF*0..1]-(:Category),
       AttP = (c)-[:HAS_ATTRIBUTE]->(att:AttributeType)
WITH COLLECT(SubCatsP) as category, RELATIONSHIPS(AttP) as attributes
CALL apoc.convert.toTree(category) yield value
RETURN value, attributes

但这将返回5条记录(每个关系[:HAS_ATTRIBUTE] 1条),并重复“类别-子类别”树。

我希望结果是:

{
 id: 1,
 name: 'Category 1',
 SUBCATEGORY_OF:[
   {id:2, name: 'Subcategory 2'}, ...
  ]
 HAS_ATTRIBUTE:[
   {name: 'Attribute 1', required: false, att: {name:'AttributeType 5',id:5}}, ...
<OR>
{name: 'Attribute 1', required: false, att.name:'AttributeType 5',att.id:5}, ...
  ]
}

这是否有可能,或者您是否认为执行2个单独查询的更好方法?

您可以尝试将路径合并到一个列表中:

MATCH  (:Customer {id:1})<-[:CREATED_BY]-(c:Category {id:1}),
   SubCatsP = (c)<-[:SUBCATEGORY_OF*0..1]-(:Category),
   AttP = (c)-[:HAS_ATTRIBUTE]->(att:AttributeType)
WITH COLLECT(SubCatsP) + COLLECT(AttP) as category
CALL apoc.convert.toTree(category) yield value
RETURN value

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM