NEO4j Return 来自数据库的嵌套、分层 JSON
NEO4j Return a nested, hierarchical JSON from a DB
我在 db 上有一个树模型,如图所示
- 城市节点通过IS_A_City_BELONGING_TO
链接到地区节点
- Sector 节点通过 IS_A_SECTOR_BELONGING_TO_THAT_REGION
链接到 Region 节点
- Sector 节点通过 IS_A_SECTOR_BELONGING_TO_THAT_CITY
链接到 City 节点
分层嵌套json理想输出如下
Indexes
ON :TTL(ttl) ONLINE
ON :City(cityName) ONLINE (for uniqueness constraint)
ON :Region(region) ONLINE (for uniqueness constraint)
ON :Sector(sectorName) ONLINE (for uniqueness constraint)
Constraints
ON ( city:City ) ASSERT city.cityName IS UNIQUE
ON ( region:Region ) ASSERT region.region IS UNIQUE
ON ( sector:Sector ) ASSERT sector.sectorName IS UNIQUE
如何使用密码请求从数据库生成 json 文件。
非常感谢。
所以...您的层次结构有点难以阅读...所以我将重点放在 JSON 响应部分。虽然 Neo4j 没有 Map 作为 属性 类型,但它在 Cypher 中是有效的。
要将结果汇总到 map,您可以使用这种格式
MATCH (c:City)<--(s:Sector)
RETURN {city_node:c, city_properties:PROPERTIES(c) name:c.name, sectors:COLLECT(s)} as city
基本上{} as varname
定义你的地图,{}
的内容定义键值对。
并且您可以像 WITH map1 + map2 as mymap
一样使用 + 运算符合并 2 个地图。在冲突的情况下,第二个映射中的值优先。
如果你只想要一个节点的属性,而不是整个节点的属性,你可以使用 PROPERTIES(c)
function 而不是传入节点。
您很快就会注意到一件事,那就是这不会以递归方式工作。在您的情况下,它看起来固定在 2 层嵌套深度。所以这个限制应该不是问题。
附带说明一下,如果这是为了扩展,您可能希望让您的 Cypher 分页 (LIMIT+SKIP) 以缩短响应时间。 (只 return 你需要的东西)就此而言,最好聚合这个客户端,因为你可能会 return 经常为每个城市的一些部门。
我在 db 上有一个树模型,如图所示
- 城市节点通过IS_A_City_BELONGING_TO 链接到地区节点
- Sector 节点通过 IS_A_SECTOR_BELONGING_TO_THAT_REGION 链接到 Region 节点
- Sector 节点通过 IS_A_SECTOR_BELONGING_TO_THAT_CITY 链接到 City 节点
分层嵌套json理想输出如下
Indexes
ON :TTL(ttl) ONLINE
ON :City(cityName) ONLINE (for uniqueness constraint)
ON :Region(region) ONLINE (for uniqueness constraint)
ON :Sector(sectorName) ONLINE (for uniqueness constraint)
Constraints
ON ( city:City ) ASSERT city.cityName IS UNIQUE
ON ( region:Region ) ASSERT region.region IS UNIQUE
ON ( sector:Sector ) ASSERT sector.sectorName IS UNIQUE
如何使用密码请求从数据库生成 json 文件。
非常感谢。
所以...您的层次结构有点难以阅读...所以我将重点放在 JSON 响应部分。虽然 Neo4j 没有 Map 作为 属性 类型,但它在 Cypher 中是有效的。
要将结果汇总到 map,您可以使用这种格式
MATCH (c:City)<--(s:Sector)
RETURN {city_node:c, city_properties:PROPERTIES(c) name:c.name, sectors:COLLECT(s)} as city
基本上{} as varname
定义你的地图,{}
的内容定义键值对。
并且您可以像 WITH map1 + map2 as mymap
一样使用 + 运算符合并 2 个地图。在冲突的情况下,第二个映射中的值优先。
如果你只想要一个节点的属性,而不是整个节点的属性,你可以使用 PROPERTIES(c)
function 而不是传入节点。
您很快就会注意到一件事,那就是这不会以递归方式工作。在您的情况下,它看起来固定在 2 层嵌套深度。所以这个限制应该不是问题。
附带说明一下,如果这是为了扩展,您可能希望让您的 Cypher 分页 (LIMIT+SKIP) 以缩短响应时间。 (只 return 你需要的东西)就此而言,最好聚合这个客户端,因为你可能会 return 经常为每个城市的一些部门。