2. RDF序列化格式转换

任务说明

本案例要求实现一个RDF序列化格式转换工具,支持在Turtle、RDF/XML、N-Triples三种常见格式之间相互转换。给定任意一种格式的RDF数据文件,程序应能解析并输出为目标格式文件,同时保证转换前后三元组集合完全一致。

实现方案

使用Python的rdflib库完成核心转换逻辑。该库内置多种RDF解析器和序列化器,可统一通过图对象(Graph)作为中间表示,实现无损格式转换。程序接收输入文件路径、输入格式、输出文件路径、输出格式四个参数,通过命令行调用。

输入文件 input.ttl Parser (输入格式) Graph RDF三元组集合 Serializer (输出格式) 输出文件 output.rdf 支持格式:turtle / xml / nt rdflib 统一解析与序列化

代码实现


#!/usr/bin/env python3
"""RDF序列化格式转换工具:支持Turtle、RDF/XML、N-Triples互转。"""
import sys
from rdflib import Graph

# 支持的格式映射(rdflib内部名称 → 文件扩展名)
FORMAT_MAP = {
    'turtle': 'ttl',
    'xml': 'rdf',
    'nt': 'nt',
}

def convert(input_path, input_fmt, output_path, output_fmt):
    """执行格式转换,返回转换后的三元组数量。"""
    # 1. 解析输入文件到图对象
    g = Graph()
    g.parse(input_path, format=input_fmt)

    # 2. 序列化输出到目标文件
    g.serialize(destination=output_path, format=output_fmt)

    return len(g)

def main():
    if len(sys.argv) != 5:
        print("用法: python rdf_convert.py <输入文件> <输入格式> <输出文件> <输出格式>")
        print("格式可选: turtle / xml / nt")
        sys.exit(1)

    input_path, input_fmt = sys.argv[1], sys.argv[2]
    output_path, output_fmt = sys.argv[3], sys.argv[4]

    # 校验格式参数
    for fmt in (input_fmt, output_fmt):
        if fmt not in FORMAT_MAP:
            print(f"错误: 不支持的格式 '{fmt}',可选: turtle / xml / nt")
            sys.exit(1)

    try:
        count = convert(input_path, input_fmt, output_path, output_fmt)
        print(f"转换成功: {input_path} → {output_path}")
        print(f"共处理 {count} 个三元组")
    except Exception as e:
        print(f"转换失败: {e}")
        sys.exit(1)

if __name__ == '__main__':
    main()

依赖安装


pip install rdflib

使用示例

准备一个Turtle格式的输入文件example.ttl:


@prefix ex: <http://example.org/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .

ex:alice a foaf:Person ;
    foaf:name "Alice" ;
    foaf:knows ex:bob .

执行转换命令:


# Turtle → RDF/XML
python rdf_convert.py example.ttl turtle output.rdf xml

# Turtle → N-Triples
python rdf_convert.py example.ttl turtle output.nt nt

验证方法

转换完成后,通过以下步骤验证转换正确性:

  1. 文件生成检查:确认输出文件已创建且非空。
  2. 三元组数量对比:程序输出的三元组数量应与输入文件中的三元组数量一致(示例中为3个)。
  3. 内容一致性验证:使用rdflib重新加载输出文件,与原图进行同构比较:

from rdflib import Graph

g1 = Graph()
g1.parse("example.ttl", format="turtle")

g2 = Graph()
g2.parse("output.rdf", format="xml")

# 图同构比较(忽略空白节点标签差异)
print("转换一致:", g1.isomorphic(g2))  # 预期输出: True

判定标准:上述验证脚本输出True,且程序无报错退出,即判定转换功能正确。若输入文件包含空白节点,isomorphic()方法可正确识别结构等价性。