Trustfall查询引擎中的高级特性解析:折叠、参数化边与类型转换

Trustfall查询引擎中的高级特性解析:折叠、参数化边与类型转换

trustfall A query engine for any combination of data sources. Query your files and APIs as if they were databases! trustfall 项目地址: https://gitcode.com/gh_mirrors/tr/trustfall

Trustfall查询引擎提供了一系列强大的特性,使开发者能够构建复杂而精确的数据查询。本文将深入解析三个核心高级特性:@fold折叠操作、参数化边以及类型转换,帮助开发者掌握这些特性的工作原理和使用场景。

一、@fold折叠操作详解

@fold是Trustfall中处理嵌套查询结果的强大工具,它允许开发者将内部查询的结果"折叠"到外部查询的结果中。

1.1 基本工作原理

当遇到@fold标记时,查询处理流程如下:

  1. 查询分割:将原始查询在标记@fold的边E处分割为两部分

    • 外部查询(包含原始查询根)
    • 内部查询(将被折叠的部分)
  2. 查询执行:分别执行外部查询和内部查询

  3. 结果关联:对于外部查询中的每个顶点A,找到通过边E连接到内部查询顶点B的所有实例

  4. 结果处理

    • 若无连接实例,则折叠结果为空列表
    • 否则,通过平面映射创建顶点集列表
  5. 输出处理

    • _x_count:引用列表大小
    • @output:从列表中的每个结果集获取输出字段值

1.2 嵌套折叠场景

@fold内部再嵌套@fold时,处理过程会递归执行。最终输出结果的类型将为[[X]!]!(非空列表的非空列表),其中X本身可以是可空或非空类型。

1.3 与@recurse的交互

若标记@fold的边E同时标记了@recurse,则处理算法会结合递归语义:

  • 顶点A和B被视为通过递归边E连接的条件是:在A和B实例之间存在一条路径,该路径包含0到递归深度个边E的实例

1.4 与@tag的交互

有三种值得注意的情况:

  1. @fold作用域使用外部定义的@tag
  2. @fold作用域使用自身作用域内定义的@tag(不在嵌套@fold中)
  3. 任何作用域使用嵌套@fold内定义的@tag

二、参数化边的深度解析

参数化边是接受参数的边,这些参数作为边必须满足的谓词。参数值可以是可空的,也可以有默认值。

2.1 基本行为

在没有@recurse@optional等边指令的情况下,边参数指定的谓词行为类似于@filter指令。例如:

{
    Directory {
        name @output(out_name: "dir_name")
        out_Directory_ContainsFile(extension: "txt") {
            name @output(out_name: "file_name")
        }
    }
}

这与使用@filter的查询语义等效。

2.2 与@optional的结合

当参数化边标记为@optional时,其行为与使用@filter的方式有本质区别:

  • 参数化边方式:谓词是边本身的一部分,@optional只考虑匹配谓词的边
  • @filter方式:谓词在边之后应用,会影响结果过滤

2.3 与@recurse的结合

递归参数化边的行为也不同于在递归边后使用@filter

  • 参数化边方式:递归遍历中的所有边都必须满足谓词
  • @filter方式:只有最终顶点需要满足谓词,中间顶点不受限制

三、类型转换的语义

类型转换在语义上定义为最多一个基数的自边,因此类型转换本身可以是可选的。

3.1 基本用法示例

{
    Directory {
        dir_name: name @output
        out_Directory_HasSubdirectory @recurse(depth: 10) {
            subdir_name: name @output
            out_Directory_File {
                file_name: name @output
                ... on TextFile @optional {
                    line_count @output
                }
            }
        }
    }
}

此查询递归获取子目录中的文件名,并为文本格式的文件获取行数。

3.2 在@optional@fold边中的行为

由于类型转换是类似过滤的操作,在@optional边内部的行为与过滤器一致:

  • 如果@optional边存在但结果顶点无法正确转换,其结果集将被丢弃
  • 这与边本身不是@optional时的处理方式相同

四、总结

Trustfall查询引擎通过这些高级特性提供了强大的数据查询能力:

  1. @fold提供了处理嵌套查询结果的灵活方式
  2. 参数化边允许在边级别定义谓词,与@optional@recurse交互时表现出独特行为
  3. 类型转换作为过滤操作,保持了与查询其他部分的一致性

理解这些特性的工作原理和交互方式,将帮助开发者构建更精确、更高效的查询。

trustfall A query engine for any combination of data sources. Query your files and APIs as if they were databases! trustfall 项目地址: https://gitcode.com/gh_mirrors/tr/trustfall

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

史舒畅Cunning

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值