TDengine 与 Ontop 集成指南:基于 SPARQL 的时序数据虚拟知识图谱查询
【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine
导读
本文介绍如何将 TDengine 时序数据库接入 Ontop 虚拟知识图谱(VKG)系统,把智能电表等 IoT 场景的时序数据通过 W3C 标准的 SPARQL 接口进行语义化查询与分析。读者将掌握 Ontop 的 JDBC 数据源配置、.obda表映射规则、TDengine 与 RDF 数据类型的自动转换机制,以及一套完整的“数据生成 → 映射配置 → SPARQL 查询 → 结果解析”实战流程。
什么是 Ontop,为什么需要它
Ontop 是一个开源的虚拟知识图谱系统,由意大利博尔扎诺自由大学(Free University of Bozen-Bolzano)的 KRDB 研究组开发。它的核心价值在于:无需将关系型数据库中的数据迁移到独立的图数据库,即可动态地将关系型数据库内容“虚拟”映射为知识图谱(Knowledge Graph)。
- 数据查询通过SPARQL(W3C 标准化的 RDF 查询语言)接口完成;
- 查询结果自动转换为RDF(资源描述框架)格式输出;
- 支持 MySQL、PostgreSQL、Oracle、SQL Server、SQLite 以及TDengine等多种数据库作为底层数据源。
从源码结构看,Ontop 将数据库表视为“事实来源”,通过 OBDA(Ontology-Based Data Access,基于本体的数据访问)映射文件描述表字段到 RDF 三元组的对应关系,从而在上层提供一套统一、符合 W3C 标准的语义数据访问层。对于时序数据而言,这意味着 IoT 原始数据仍保存在 TDengine 中(享受其列式存储与压缩优势),同时可以叠加知识图谱的逻辑推理能力进行语义级分析。
集成前置条件
Ontop 通过 TDengine Java Connector 连接 TDengine 数据源,集成前需要准备以下环境:
| 前置项 | 要求 | 说明 |
|---|---|---|
| TDengine 集群 | 版本3.3.6.0及以上 | Enterprise 与 Community 版本均支持 |
| taosAdapter | 正常运行 | 提供 WebSocket/REST 接口供连接器访问,详见 taosAdapter 参考手册 |
| JDBC 驱动 | 版本3.6.0及以上 | 即taos-jdbcdriver(com.taosdata.jdbc:taos-jdbcdriver) |
| Ontop | version5分支 | TDengine 支持已合入该分支但尚未正式发布,需按 Ontop 项目 README 自行下载源码构建 |
关于 taosAdapter,其默认在6041端口同时提供 HTTP/RESTful 与 WebSocket 服务(对应配置项port),TDengine 各语言连接器正是通过该 WebSocket 接口与集群通信,因此它是本方案中 Ontop 与 TDengine 之间的关键桥梁。
配置数据源
在 Ontop 中配置 TDengine 数据源分为三个步骤:安装 JDBC 驱动、配置 JDBC 连接、配置表映射。
1. 安装 JDBC 驱动
下载 taos-jdbcdriver 的 DIST 驱动包(.jar文件),将其放入 Ontop 主程序的jdbc/目录下,使 Ontop 运行时能加载该驱动。
2. 配置 JDBC 连接
在 Ontop 的.properties文件中配置 JDBC 连接信息:
jdbc.url = jdbc:TAOS-WS://[host]:[port]/[database] jdbc.user = [username] jdbc.password = [password] jdbc.driver = com.taosdata.jdbc.ws.WebSocketDriver其中关键点在于 URL 的书写格式。根据 TDengine Java Connector 文档,taos-jdbcdriver 的 JDBC URL 规范为:
jdbc:[TAOS|TAOS-WS]://[host1:port1,host2:port2,...,hostN:portN]/[database_name]?[user={user}&password={password}&charset={charset}&cfgdir={config_dir}&locale={locale}&timezone={timezone}&varcharAsString=true]结合本集成方案,应遵循以下约定:
驱动类固定为
com.taosdata.jdbc.ws.WebSocketDriver,即使用 WebSocket 连接方式;URL 以
jdbc:TAOS-WS://开头,端口使用 taosAdapter 的 6041(而非原生连接的 6030);WebSocket 连接不依赖客户端驱动(无需安装
libtaos.so等本地库),部署更简单;WebSocket 方式支持配置多个端点地址(逗号分隔),连接时随机选取以实现负载均衡;IPv6 地址需使用方括号(如
[::1]、[2001:db8::1]);可在 URL 中附加连接参数,例如:
jdbc:TAOS-WS://taosdemo.com:6041,taosdemo2.com:6041/power?user=root&password=taosdata&varcharAsString=true
值得特别注意的是conmode(BI 模式)参数:taos-jdbcdriver 为 BI 工具集成场景提供了conmode=1的选项,开启后元数据信息不统计子表,主要服务于 BI 工具的元数据探查。Ontop 作为典型的 BI/语义分析集成方,若在元数据获取阶段遇到子表数量干扰,可在 URL 中追加conmode=1尝试。其余常用 WebSocket 参数还包括连接超时httpConnectTimeout(默认 60000ms)、消息超时messageWaitTimeout(默认 60000ms)、自动重连enableAutoReconnect(默认 false)等,详见 Java 连接器文档的 Properties 章节。
提示:自 taos-jdbcdriver 3.4.0 起官方推荐使用 WebSocket 连接替代 REST 连接(
jdbc:TAOS-RS://),WebSocket 具有更低延迟、自动重连与更丰富的功能支持,本方案直接采用推荐方式。
3. 配置表映射(.obda 文件)
在.obda文件中定义 TDengine 表到 Ontop 的映射关系。以下以智能电表场景为例:
[PrefixDeclaration] : http://example.org/tde ns: http://example.org/ns# [MappingDeclaration] @collection [[ mappingId meters-mapping target ns:{ts} a ns:Meters ; ns:ts {ts} ; ns:voltage {voltage}; ns:phase {phase}; ns:groupid {groupid}; ns:location {location}^^xsd:string . source SELECT ts, voltage, phase, groupid, location from test.meters ]]格式说明
| 关键字段 | 说明 |
|---|---|
| mappingId | 映射 ID,唯一标识一条映射关系 |
| source | TDengine SQL 查询语句(支持复杂查询) |
| target | 字段映射关系(未指定类型时使用默认转换规则) |
target中的{ts}、{voltage}等占位符引用source查询返回的列名,将每一行数据实例化为一条 RDF 三元组描述;a是 RDF 中表示 “is a” 关系的语法糖,此处声明每条记录ns:Meters类型的实例。
4. 数据类型自动转换规则
可在target中显式指定映射数据类型(如{location}^^xsd:string)。若未指定,Ontop 依据 JDBC 返回的 Java 类型按下表默认转换:
| TDengine JDBC 数据类型 | Ontop 数据类型 |
|---|---|
| java.sql.Timestamp | xsd:datetime |
| java.lang.Boolean | xsd:boolean |
| java.lang.Byte | xsd:byte |
| java.lang.Short | xsd:short |
| java.lang.Integer | xsd:int |
| java.lang.Long | xsd:long |
| java.math.BigInteger | xsd:nonNegativeInteger |
| java.lang.Float | xsd:float |
| java.lang.Double | xsd:double |
| byte[] | xsd:base64Binary |
| java.lang.String | xsd:string |
| java.math.BigDecimal | xsd:decimal |
可以看到,TDengine 中典型的时间戳、数值、字符串等类型都能被精准映射到 XSD 标准类型,从而保证 SPARQL 查询中的类型过滤与排序语义正确。完整的.obda映射语言格式说明可参考 Ontop 官方的映射语言文档(Mapping Language)。
5. 测试连接
启动 Ontop 端点服务验证配置:
ontop endpoint -p db.properties -m db.obda --port 8080启动后访问http://localhost:8080,若能看到 SPARQL 查询界面,则说明配置成功。
实战:智能电表负载分析
场景介绍
某居民小区将智能电表数据存储于 TDengine 数据库中。本案例使用 Ontop 将电表时序数据转换为虚拟知识图谱,并通过 SPARQL 接口查询电压超过 240V 的设备,以识别高负载设备。
数据准备
使用 taosBenchmark 生成模拟数据:
# 生成 100 台设备,每台 1000 条记录 taosBenchmark -t 100 -n 1000 -y从 taosBenchmark 源码(benchSys.c 中的参数解析)可以确认上述参数含义:
| 参数 | 含义 |
|---|---|
-t | 子表(child table)数量,此处即 100 台电表设备 |
-n | 每个子表插入的记录行数,此处即每台设备 1000 条 |
-y | answer_yes = true,跳过交互确认,自动执行 |
taosBenchmark 在默认(demo)模式下会自动创建名为test的数据库和名为meters的超级表(见 benchCommandOpt.c 中initStable()的stbInfo->stbName = "meters"),其默认列为current、voltage、phase三个数值列,并附加若干标签列(含groupid、location等),与本文.obda映射中from test.meters的查询完全对应。默认生成数据的电压值域由内置函数控制,实际生成的数值以工具运行为准;若需构造更贴近高压告警阈值的样本,可结合 taosBenchmark 的 JSON 配置文件自定义字段取值范围。
配置文件
db.properties(连接配置):
jdbc.url=jdbc:TAOS-WS://localhost:6041/test jdbc.user=root jdbc.password=taosdata jdbc.driver=com.taosdata.jdbc.ws.WebSocketDriverdb.obda(映射配置):复用上文“配置表映射”一节中的示例内容,将test.meters表映射为ns:Meters类型的知识图谱节点。
分析电表负载
创建 SPARQL 查询语句:查询电压超过 240V 的智能电表设备,按电压降序返回前 2 条结果:
PREFIX ns: <http://example.org/ns#> SELECT ?ts ?voltage ?phase ?groupid ?location WHERE { ?m a ns:Meters ; ns:ts ?ts; ns:voltage ?voltage; ns:phase ?phase; ns:groupid ?groupid; ns:location ?location. FILTER(?voltage > 240) } ORDER BY DESC(?voltage) LIMIT 2该查询通过
FILTER(?voltage > 240)完成语义层过滤,ORDER BY DESC(?voltage)实现按电压降序排序,LIMIT 2截取前两行,完整演示了 SPARQL 对 RDF 化时序数据的筛选、排序与投影能力。在 SPARQL 查询界面输入上述语句,点击 "Run" 按钮,即可得到结果(见本文开头截图)。
查询结果以SPARQL JSON 格式返回,包含电表采集时间戳、电压读数、相位、组 ID 与设备位置信息:
{ "head" : { "vars" : [ "ts", "voltage", "phase", "groupid", "location" ] }, "results" : { "bindings" : [ { "ts" : { "datatype" : "http://www.w3.org/2001/XMLSchema#dateTime", "type" : "literal", "value" : "2025-07-02T15:22:55.098" }, "voltage" : { "datatype" : "http://www.w3.org/2001/XMLSchema#integer", "type" : "literal", "value" : "263" }, "phase" : { "datatype" : "http://www.w3.org/2001/XMLSchema#double", "type" : "literal", "value" : "143.2" }, "groupid" : { "datatype" : "http://www.w3.org/2001/XMLSchema#integer", "type" : "literal", "value" : "2" }, "location" : { "type" : "literal", "value" : "California.PaloAlto" } }, { "ts" : { "datatype" : "http://www.w3.org/2001/XMLSchema#dateTime", "type" : "literal", "value" : "2025-07-02T15:23:30.186" }, "voltage" : { "datatype" : "http://www.w3.org/2001/XMLSchema#integer", "type" : "literal", "value" : "259" }, "phase" : { "datatype" : "http://www.w3.org/2001/XMLSchema#double", "type" : "literal", "value" : "132.1" }, "groupid" : { "datatype" : "http://www.w3.org/2001/XMLSchema#integer", "type" : "literal", "value" : "2" }, "location" : { "type" : "literal", "value" : "California.PaloAlto" } } ] } }从返回的绑定数据可以验证前文的数据类型转换规则:时间戳
ts以xsd:dateTime类型返回(TDengine 的 TIMESTAMP 列经由java.sql.Timestamp转换而来),voltage、groupid以xsd:integer返回,phase以xsd:double返回,location为普通字符串字面量。这保证了语义层查询结果的类型完整性与机器可读性。
总结
通过 TDengine 与 Ontop 的集成,本方案实现了:
- 时序数据自动转换为 RDF:TDengine 中的电表数据无需迁移,即可经由
.obda映射在语义层呈现为知识图谱实体,支持 SPARQL 语义查询; - 统一的数据访问接口:符合 W3C 标准的 SPARQL/RDF 体系,屏蔽底层关系型与时序型数据库的差异;
- 解锁工业 IoT 的知识图谱分析与推理能力:在时序数据库之上叠加本体推理,为复杂 IoT 场景(如设备故障根因分析、能效优化等)提供具备认知能力的智能分析方案。
这种“时序数据库 + 虚拟知识图谱”的组合,为时序数据库领域提供了一种新的智能化范式:既保留 TDengine 在时序数据存储、查询上的高性能优势,又通过知识图谱的逻辑推理能力与大型语言模型的泛化能力相结合,面向复杂 IoT 场景输出智能分析解决方案。读者可在此基础上进一步扩展映射(如关联设备台账表、告警规则表),构建更丰富的语义分析模型。
【免费下载链接】TDengineHigh-performance, scalable time-series database designed for Industrial IoT (IIoT) scenarios项目地址: https://gitcode.com/GitHub_Trending/tde/TDengine
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考