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

相关推荐
释厄6231 小时前
学术引用本体论——WorkBuddy 学术科学文化三违反
网络·人工智能·算法
梦帮科技1 小时前
【3.0修订版】 RNS 代币架构:ERC20 五件套扩展与六钱包分配
数据结构·后端·算法·架构·node.js·区块链·php
ccstuck1 小时前
AI安全系列:开源RAG系统测试
人工智能·安全·开源·ai安全
视+老张1 小时前
AI导游怎样把一次问答转成可执行路线:地点实体与任务状态设计
人工智能·ar·增强现实
IT_陈寒1 小时前
SpringBoot自动配置的坑:你以为的捷径可能是弯路
前端·人工智能·后端
xsd202411181 小时前
Open-Magiviz:解决AI长视频角色不一致与画面跳跃
人工智能
XMAIPC_Robot1 小时前
RK3576/RK3588+FPGA+AI数据采集系统:实时性与边缘AI算力兼顾
人工智能·fpga开发·机器人·数据采集·rk3588+fpga·rk3576+fpga
TGITCIC1 小时前
CNN 小白实战入门(九):检测到人脸后,进一步判断谁戴了口罩
人工智能·cnn·人脸识别·卷积神经网络·人脸
“AI国潮设计-小江”1 小时前
《Python+SDXL实战:用ControlNet精准控制“英歌舞戚风蛋糕”质感,附批量生成脚本》
开发语言·人工智能·python·prompt·aigc