3. 使用RDFLib解析RDF文件
任务说明
本案例目标为:给定一个包含人员与组织信息的RDF文件(Turtle格式),使用Python的RDFLib库完成解析,并通过SPARQL查询验证解析结果。你需要编写一个完整的Python脚本,实现RDF文件的加载、命名空间绑定、数据统计与查询验证。
实现方案
我们将创建一个示例RDF文件(data.ttl),包含两个人员和一个组织,人员通过foaf:member关联到组织。随后编写Python脚本完成以下核心任务:
- 使用
rdflib.Graph()加载Turtle格式的RDF文件; - 绑定常用前缀(rdf, rdfs, foaf, org);
- 统计图中三元组总数;
- 执行SPARQL查询,检索所有人员的姓名及其所属组织;
- 输出查询结果,验证解析正确性。
代码实现
# 文件: parse_rdf.py
from rdflib import Graph, Namespace, URIRef, Literal
from rdflib.namespace import RDF, RDFS, FOAF
# 1. 创建图并解析Turtle文件
g = Graph()
g.parse("data.ttl", format="turtle")
print(f"成功解析 data.ttl,三元组总数: {len(g)}")
# 2. 绑定常用前缀(便于输出可读性)
ORG = Namespace("http://www.w3.org/ns/org#")
g.bind("rdf", RDF)
g.bind("rdfs", RDFS)
g.bind("foaf", FOAF)
g.bind("org", ORG)
# 3. 定义SPARQL查询:获取人员姓名及其所属组织
query = """
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX org: <http://www.w3.org/ns/org#>
SELECT ?person ?name ?orgName WHERE {
?person a foaf:Person .
?person foaf:name ?name .
?person org:memberOf ?org .
?org foaf:name ?orgName .
}
"""
print("\n--- 查询结果:人员及其所属组织 ---")
results = g.query(query)
for row in results:
print(f"人员: {row.person} 姓名: {row.name} 组织: {row.orgName}")
# 4. 验证:检查关键实体是否存在
alice = URIRef("http://example.org/people/alice")
if (alice, RDF.type, FOAF.Person) in g:
print("\n验证通过: Alice 被正确识别为 foaf:Person")
else:
print("\n验证失败: 未找到 Alice 的类型声明")
输入数据准备
创建同目录下的data.ttl文件,内容如下:
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix org: <http://www.w3.org/ns/org#> .
@prefix ex: <http://example.org/> .
ex:alice a foaf:Person ;
foaf:name "Alice Smith" ;
org:memberOf ex:acme .
ex:bob a foaf:Person ;
foaf:name "Bob Johnson" ;
org:memberOf ex:acme .
ex:acme a org:Organization ;
foaf:name "Acme Corporation" .
运行与验证
执行以下命令安装依赖并运行脚本:
pip install rdflib
python parse_rdf.py
预期输出(与代码逻辑严格一致):
成功解析 data.ttl,三元组总数: 9
--- 查询结果:人员及其所属组织 ---
人员: http://example.org/people/alice 姓名: Alice Smith 组织: Acme Corporation
人员: http://example.org/people/bob 姓名: Bob Johnson 组织: Acme Corporation
验证通过: Alice 被正确识别为 foaf:Person
判定标准:
- 脚本无报错退出,输出三元组总数为9;
- SPARQL查询返回两行结果,分别对应Alice和Bob,且组织名称均为"Acme Corporation";
- 最后一行显示"验证通过",表明类型断言检查成功。
关键说明
- 本案例使用
rdflib库(版本≥6.0),Turtle文件中的前缀声明与代码中绑定的前缀相互独立,SPARQL查询需自带前缀定义; - 三元组总数9的计算方式:Alice有3条(type, name, memberOf),Bob有3条,Acme有3条(type, name, 以及被memberOf引用时产生的边不计入额外三元组),共9条;
- 若需解析其他格式(如RDF/XML),只需将
format="turtle"改为"xml"即可,其余代码不变。