目录
[1. 核心概念](#1. 核心概念)
[2. Turtle 示例](#2. Turtle 示例)
[3. 其他序列化格式](#3. 其他序列化格式)
[4. 用 SPARQL 查询](#4. 用 SPARQL 查询)
[5. Python 使用示例:rdflib](#5. Python 使用示例:rdflib)
[6. 常见用途](#6. 常见用途)
[7. 注意点](#7. 注意点)
RDF(Resource Description Framework,资源描述框架)是 W3C 提出的标准数据模型,用来描述"资源"以及资源之间的关系。它的核心思想是:一切知识都可以拆成"主语---谓语---宾语"三元组,大量三元组构成一张有向图。
1. 核心概念
一个 RDF 三元组写作:
主语(subject) 谓语(predicate) 宾语(object)
约束:
-
主语:IRI 或空白节点(不能是字面量)
-
谓语:IRI
-
宾语:IRI、空白节点或字面量
-
IRI:全局标识符,类似 URL,如 http://example.org/Alice
-
字面量:字符串、数字、日期等,可带语言标签或数据类型,如 "Alice"@en、30、"2024-01-01"^^xsd:date
-
空白节点:没有全局名字的匿名节点
-
RDF 图:三元组集合,顺序不重要,重复三元组不增加信息
RDF 本身只是数据模型,不是文件格式。常见序列化格式有:
-
Turtle:人类可读,最常用
-
RDF/XML:最早的官方格式
-
JSON-LD:适合 Web 和搜索引擎结构化数据
-
N-Triples / N-Quads:一行一个三元组,便于处理
查询 RDF 用 SPARQL;定义类和属性用 RDFS/OWL;验证数据用 SHACL/ShEx。
2. Turtle 示例
描述 Alice、Bob 和 Acme 公司:
XML
@prefix ex: <http://example.org/> .
@prefix foaf: <http://xmlns.com/foaf/0.1/> .
@prefix schema: <http://schema.org/> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
ex:Alice a foaf:Person ;
foaf:name "Alice"@en ;
foaf:age 30 ;
foaf:mbox <mailto:alice@example.org> ;
foaf:knows ex:Bob ;
schema:worksFor ex:Acme .
ex:Bob a foaf:Person ;
foaf:name "Bob"@zh .
ex:Acme a schema:Organization ;
schema:name "Acme Corp" .
其中 a 是 rdf:type 的简写。上面数据等价于这些三元组:
XML
ex:Alice rdf:type foaf:Person .
ex:Alice foaf:name "Alice"@en .
ex:Alice foaf:age "30"^^xsd:integer .
ex:Alice foaf:knows ex:Bob .
ex:Alice schema:worksFor ex:Acme .
ex:Bob foaf:name "Bob"@zh .
ex:Acme schema:name "Acme Corp" .
3. 其他序列化格式
同一份数据的 RDF/XML 片段:
XML
<?xml version="1.0"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:foaf="http://xmlns.com/foaf/0.1/"
xmlns:schema="http://schema.org/"
xmlns:ex="http://example.org/">
<foaf:Person rdf:about="http://example.org/Alice">
<foaf:name xml:lang="en">Alice</foaf:name>
<foaf:age rdf:datatype="http://www.w3.org/2001/XMLSchema#integer">30</foaf:age>
<foaf:knows rdf:resource="http://example.org/Bob"/>
<schema:worksFor rdf:resource="http://example.org/Acme"/>
</foaf:Person>
<foaf:Person rdf:about="http://example.org/Bob">
<foaf:name xml:lang="zh">Bob</foaf:name>
</foaf:Person>
<schema:Organization rdf:about="http://example.org/Acme">
<schema:name>Acme Corp</schema:name>
</schema:Organization>
</rdf:RDF>
JSON-LD 片段:
TypeScript
{
"@context": {
"foaf": "http://xmlns.com/foaf/0.1/",
"schema": "http://schema.org/",
"xsd": "http://www.w3.org/2001/XMLSchema#"
},
"@id": "http://example.org/Alice",
"@type": "foaf:Person",
"foaf:name": { "@value": "Alice", "@language": "en" },
"foaf:age": { "@value": 30, "@type": "xsd:integer" },
"foaf:knows": { "@id": "http://example.org/Bob" },
"schema:worksFor": { "@id": "http://example.org/Acme" }
}
4. 用 SPARQL 查询
查询"谁在什么公司工作":
sql
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX schema: <http://schema.org/>
SELECT ?personName ?orgName WHERE {
?person a foaf:Person ;
foaf:name ?personName ;
schema:worksFor ?org .
?org schema:name ?orgName .
}
结果会得到:
sql
personName = "Alice"@en
orgName = "Acme Corp"
5. Python 使用示例:rdflib
python
from rdflib import Graph, Namespace, Literal, RDF
from rdflib.namespace import FOAF, XSD
g = Graph()
EX = Namespace("http://example.org/")
g.add((EX.Alice, RDF.type, FOAF.Person))
g.add((EX.Alice, FOAF.name, Literal("Alice", lang="en")))
g.add((EX.Alice, FOAF.age, Literal(30, datatype=XSD.integer)))
g.add((EX.Alice, FOAF.knows, EX.Bob))
g.add((EX.Bob, RDF.type, FOAF.Person))
g.add((EX.Bob, FOAF.name, Literal("Bob", lang="zh")))
print(g.serialize(format="turtle"))
q = """
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?friendName WHERE {
<http://example.org/Alice> foaf:knows ?friend .
?friend foaf:name ?friendName .
}
"""
for row in g.query(q):
print(row.friendName)
6. 常见用途
-
知识图谱:Wikidata、DBpedia、企业知识图谱
-
搜索引擎结构化数据:Schema.org + JSON-LD
-
数据集成:把不同来源数据映射为 RDF,通过 IRI 链接
-
元数据管理:图书馆、数字档案、内容管理
-
推理:结合 RDFS/OWL,从已有三元组推出新关系
-
开放数据:Linked Data、政府开放数据
7. 注意点
RDF 只负责"表达事实",不负责约束和推理。
例如 ex:Alice foaf:knows ex:Bob 只是一个事实;如果要说明 foaf:knows是人与人的关系,需要 RDFS/OWL;如果要限制"年龄必须是整数",可以用 SHACL。
一句话总结:RDF 用三元组把知识表示成图,Turtle/JSON-LD/RDF/XML 是它的不同写法,SPARQL 用来查询,RDFS/OWL 用来定义和推理。