2. RDF序列化格式转换
任务说明
本案例要求实现一个RDF序列化格式转换工具,支持在Turtle、RDF/XML、N-Triples三种常见格式之间相互转换。给定任意一种格式的RDF数据文件,程序应能解析并输出为目标格式文件,同时保证转换前后三元组集合完全一致。
实现方案
使用Python的rdflib库完成核心转换逻辑。该库内置多种RDF解析器和序列化器,可统一通过图对象(Graph)作为中间表示,实现无损格式转换。程序接收输入文件路径、输入格式、输出文件路径、输出格式四个参数,通过命令行调用。
代码实现
#!/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
验证方法
转换完成后,通过以下步骤验证转换正确性:
- 文件生成检查:确认输出文件已创建且非空。
- 三元组数量对比:程序输出的三元组数量应与输入文件中的三元组数量一致(示例中为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()方法可正确识别结构等价性。