3. 使用RDFLib解析RDF文件

使用RDFLib解析RDF文件 学习卡片

任务说明

本案例目标为:给定一个包含人员与组织信息的RDF文件(Turtle格式),使用Python的RDFLib库完成解析,并通过SPARQL查询验证解析结果。你需要编写一个完整的Python脚本,实现RDF文件的加载、命名空间绑定、数据统计与查询验证。

实现方案

我们将创建一个示例RDF文件(data.ttl),包含两个人员和一个组织,人员通过foaf:member关联到组织。随后编写Python脚本完成以下核心任务:

  1. 使用rdflib.Graph()加载Turtle格式的RDF文件;
  2. 绑定常用前缀(rdf, rdfs, foaf, org);
  3. 统计图中三元组总数;
  4. 执行SPARQL查询,检索所有人员的姓名及其所属组织;
  5. 输出查询结果,验证解析正确性。

代码实现

# 文件: 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解析流程与数据验证 data.ttl Turtle格式 parse() rdflib.Graph() 三元组存储 len() 三元组计数 = 9 SPARQL查询 SELECT ?person ?name ?orgName WHERE { ?person a foaf:Person . ?person org:memberOf ?org } 查询结果(2行) Alice Smith → Acme Corporation Bob Johnson → Acme Corporation ✓ 类型断言验证 Alice ∈ foaf:Person

关键说明

  • 本案例使用rdflib库(版本≥6.0),Turtle文件中的前缀声明与代码中绑定的前缀相互独立,SPARQL查询需自带前缀定义;
  • 三元组总数9的计算方式:Alice有3条(type, name, memberOf),Bob有3条,Acme有3条(type, name, 以及被memberOf引用时产生的边不计入额外三元组),共9条;
  • 若需解析其他格式(如RDF/XML),只需将format="turtle"改为"xml"即可,其余代码不变。