首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Neo4j递归密码查询导致嵌套JSON结构

Neo4j递归密码查询导致嵌套JSON结构
EN

Stack Overflow用户
提问于 2022-10-10 22:29:47
回答 2查看 41关注 0票数 0

为了得到嵌套的JSON结构,我试图找出密码查询。下面我给出一个图表的例子。

代码语言:javascript
运行
复制
MATCH (user:User {name:"User_1"})
OPTIONAL MATCH (user)-[rel*]->(subUser:User)
RETURN *

上面的查询允许我获得将所有内容转换为JSON结构所需的所有节点和关系,但这要求我在查询数据库的结果后处理所有内容。为了实现这一点,我需要匹配节点的标识和关系,以获得嵌套的JSON。我想知道是否有可能通过构建密码查询直接实现这一点。重要的是,我们不知道有多少级别的“子”用户是从User_1开始的。

预期的JSON结构:

代码语言:javascript
运行
复制
{ 
    "user": "User_1",
    "children": [
        {
            "user": "User_2",
            "children": [
                {
                    "user": "User_5",
                    "children": []
                }
            ]
        },{
            "user": "User_3",
            "children": [
                {
                    "user": "User_6",
                    "children": []
                }
            ]
        },{
            "user": "User_4",
            "children": []
        }
    ]
}

有可能吗?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-10-11 05:59:41

正如@nimrod注释中所建议的那样,您可以使用apoc.convert.toTree方法,它将给您提供树结构的JSON,如所需,但有一个警告,JSON的键将是不同的。关于数据:

代码语言:javascript
运行
复制
MERGE (u1:User{name: 'User1'})
MERGE (u2:User{name: 'User2'})
MERGE (u3:User{name: 'User3'})
MERGE (u4:User{name: 'User4'})
MERGE (u5:User{name: 'User5'})
MERGE (u6:User{name: 'User6'})
MERGE (u1)-[:POINTS]->(u2)-[:POINTS]->(u5)
MERGE (u1)-[:POINTS]->(u3)-[:POINTS]->(u6)
MERGE (u1)-[:POINTS]->(u4)

查询:

代码语言:javascript
运行
复制
MATCH (user:User {name:"User1"})
OPTIONAL MATCH path = (user)-[:POINTS*]->(subUser:User)
WITH collect(path) AS paths
CALL apoc.convert.toTree(paths, true, {nodes: {User: ['name']}})
YIELD value
RETURN value

产生的输出:

代码语言:javascript
运行
复制
{
  "_type": "User",
  "name": "User1",
  "_id": 4,
  "points": [
    {
      "_type": "User",
      "name": "User3",
      "_id": 6,
      "points": [
        {
          "_type": "User",
          "name": "User6",
          "_id": 9
        }
      ]
    },
    {
      "_type": "User",
      "name": "User2",
      "_id": 5,
      "points": [
        {
          "_type": "User",
          "name": "User5",
          "_id": 8
        }
      ]
    },
    {
      "_type": "User",
      "name": "User4",
      "_id": 7
    }
  ]
}

如您所见,relationship type POINTS代替了children,而键name用于用户名。其他字段_type_id可以忽略。

票数 1
EN

Stack Overflow用户

发布于 2022-10-11 11:24:54

对于您提出的问题,apoc.convert.toTree()无疑是最好的答案。

如果一个人对文本输出感兴趣,那么ORDPATH将是另一个解决方案。ORDPATH是一个级联的位串,它按层次顺序排序。更多关于这一点在这个链接。实现此功能的Neo4j用户定义函数位于GitHub

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74021254

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档