RDF(Resource Description Framework)介绍和使用举例(二)

目录

[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 用来定义和推理。

相关推荐
怕浪猫4 小时前
这个十几个agent 协作项目值得关注
人工智能·面试·github
码客-ygluu5 小时前
X3 LUA 异步分布式微服务集群框架
c++·架构·lua
~kiss~6 小时前
A Survey of On-Policy Distillation for LLMs 学习(一)
学习
starzy19906 小时前
深入理解Scala隐式类:扩展方法机制
开发语言·人工智能·scala
深蓝AI7 小时前
为什么 agent 的 demo 都很惊艳,上了生产就不靠谱
人工智能·程序员
数字新视界7 小时前
信创动环监控在机房环境管理中的智能化应用与实践分析
大数据·人工智能·物联网·信息与通信·动环监控系统
岁月宁静7 小时前
DeepSeek Harness 实战与架构解析:让 Agent 从“会聊”到“能交付”
人工智能·python·agent
一只大鸽子7 小时前
游戏开发笔记4-像素画基础 轮廓-直线和曲线
笔记
深蓝AI8 小时前
一个项目五个 AI 同时干活,Claude Code 怎么让它们不互相打架
人工智能·程序员
forest_098 小时前
多 Agent 协作第二课:交叉验证≠独立验证
人工智能·python·算法·机器学习·prompt·agi