【问题标题】:OrientDB: How to flatten nested heirarchy into a single recordOrientDB:如何将嵌套层次结构扁平化为单个记录
【发布时间】:2023-11-27 15:30:01
【问题描述】:

我的结构看起来像这样:

如何遍历我的页面并取回一个平面记录,以便每一行代表来自根节点及其边缘的所有数据。我的用例是我正在生成一个 csv 文件。

所以从上面的示例中,我想为每个帖子创建一行。每条记录应包含帖子中的所有字段、语言名称、页面名称和网络名称。

据我所知,当您进行任何类型的遍历时,它只会给您最终顶点的结果,而不是中间顶点的任何数据。

【问题讨论】:

    标签: orientdb orientjs


    【解决方案1】:

    试试这个查询:

    select *,out('posted_to').name as page,out('posted_to').out('is_language').name as language,out('posted_to').out('is_network').name as network from <class Post> unwind page,language,network 
    

    【讨论】:

    • 从页面顶点开始执行此操作的最有效方法是什么?由于我有很多页面并且这些页面有成千上万的帖子,我希望能够进行查询以获取页面 -> 帖子(按日期过滤) -> 扁平化记录。谢谢!
    【解决方案2】:

    如果每个页面有很多帖子,那么将查询锚定在页面上可能比从帖子开始更有效。

    尔格:

    select focus.in() as post,
           focus.name as page,
           focus.out("is_language").name as language,
           focus.out("is_network").name as network
    from (select @this as focus from Page)
    unwind post, language, network, page
    
    ----+------+-----+----+--------+-------
    #   |@CLASS|post |page|language|network
    ----+------+-----+----+--------+-------
    0   |null  |#11:0|1   |Welsh   |1      
    1   |null  |#11:1|1   |Welsh   |1      
    2   |null  |#11:2|1   |Welsh   |1      
    3   |null  |#11:3|1   |Welsh   |1      
    4   |null  |#11:4|1   |Welsh   |1      
    5   |null  |#11:5|1   |Welsh   |1      
    6   |null  |#11:6|1   |Welsh   |1      
    ----+------+-----+----+--------+-------
    

    【讨论】:

    • 有没有办法让我从您的查询检索到的帖子中扩展所有字段?否则我必须分别指定每个字段吗? IE。 focus.in()[name] 作为 post_name,focus.in()[posted_at] 作为posted_at
    • 目前存在一个 OrientDB 缺陷(或错误?),它阻止人们编写“select *, expand(post) from (ABOVE)”(其中“ABOVE”是上面显示的查询)。另一方面,可以简单地写select from Post :-)
    • 对不起,如果我遗漏了一些简单的东西。你是说有一种方法可以从上面的查询中select from post,或者我唯一的选择是恢复将查询锚定在帖子而不是页面上?
    • 是的,我的意思很简单。由于您的 Post 实体如此之多,我建议您考虑使用 ODB 生成两个单独的表,您可以(如有必要)稍后加入(例如,使用命令行实用程序 join)。