HTML是可编辑的网页的标准语言,它用于传递有关面向人类的文档的结构的信息,包括语法、数据模型和语义三个部分。而对于语义网,需要其数据模型能够被各种应用所使用,而且要领域无关。
RDF(资源描述框架)恰好提供了这样一个灵活并且领域无关的数据模型。其基础构件是一个实体-属性-取值三元组,称为声明。用户必须定义他们在这些声明中使用的术语,利用RDF模式,即RDFS,允许用户精确定义他们的词汇表。
因此,RDF可以视为下面几部分的总称:
谓词逻辑(Lp)可以对原子命题做进一步分析,分析出其中的个体词、谓词、量词,研究它们的形式结构的逻辑关系、正确的推理形式和规则。
一阶逻辑之所以是“一阶”的,是因为它所包含的谓词逻辑是一阶的。谓词就是表示对象属性的语词,对象的属性具有层次。所谓一阶谓词就是指刻画个体属性的谓词,如“大于”等只适用于个体概念,而“传递性”等用来描述“大于”这种谓词的谓词就是高阶谓词了,刻画的是属性的属性。
一阶谓词逻辑具有自然性、接近自然语言、容易接受、严密性、易于转化为计算机内部形式等优点,但同时也具有无法表示不确定性知识、难以表示启发性知识及元知识、组合爆炸、效率低等缺点。
框架表示法是明斯基于1975年提出来的,其最突出的特点是善于表示结构性知识,能够把知识的内部结构关系以及知识之间的特殊关系表示出来,并把与某个实体或实体集的相关特性都集中在一起。
框架是一种描述固定情况的数据结构,一般可以把框架看成是一个节点和关系组成的网络。框架的最高层次是固定的,并且它描述对于假定情况总是正确的事物,在框架的较低层次上有许多终端,被称为槽(Slots)。在槽中填入具体值,就可以得到一个描述具体事务的框架,每一个槽都可以有一些附加说明,被称为侧面(Facet),其作用是指出槽的取值范围和求值方法等。
框架表示法具有以下优点:
语义网络是一种表达能力强而且灵活的知识表示方法。语义网络利用节点和带标记的边结构的有向图描述事件、概念、状况、动作及客体之间的关系。
采用语义网络表示的知识库的特征是利用带标记的有向图描述可能事件。结点表示客体、客体性质、概念、事件、状况和动作,带标记的边描述客体之间的关系。
语义网络的基本形式为 ( H e a d _ n o d e , R e l a t i o n , T a i l _ n o d e ) (Head\_node,Relation,Tail\_node) (Head_node,Relation,Tail_node)。节点表示各种事物、概念、情况、属性、动作、状态等,每个节点可以带有若干属性,一般用框架或元组表示;弧表示各种语义联系,指明它所连接的节点间某种语义关系。节点和弧都必须带有标示,来方便区分不同对象以及对象间各种不同的语义联系。语义网本质上是将逻辑运算符和逻辑项映射到了图中的元素。
语义网络具有以下优点:
RDF中的基本概念包括资源、属性、声明和图。
资源
资源是一个对象,每一个资源都有一个唯一的URI,从而能够避免歧义,解决一词多义的问题。使用URI不必能访问到一个资源,但是使用可以解引用的URL既能获得资源本身,还能够获取其进一步描述。
属性
属性是一类特殊的资源,描述了资源之间的关系。属性也由URI标识,也可以解引用属性的URL来找到它们的描述。
声明
声明断言了资源的属性,是一个实体-属性-取值的三元组。属性值是一个资源或者文字(literal)。文字是原子值,如数字、字符串或日期。常使用主语一词来指称三元组里的实体,而使用宾语来指称其取值。
图
可以使用图形化的方式来书写相同的声明,为了提高可读性没用URI。带标签的节点通过带标签的边连接。边是有向的,从声明的主语到声明的宾语,声明的属性被标记在边上。节点上的标签时主语和宾语的标识符。图强调了RDF是一个以图为中心的数据模型。
可以采用链接数据原则(Linked Data principle)重用信息:
指向声明和图
RDF提供了两种实现机制:
处理更丰富的谓语
将三元组 ( x , P , y ) (x,P,y) (x,P,y)看作逻辑公式 P ( x , y ) P(x,y) P(x,y)。RDF只提供二元谓词,可以将多元谓语通过添加新的额外资源转化为二元谓词组。
Tutle
Turtle( Terse RDF Triple Language ) 是一种基于文本的RDF语法。URL包含在尖括号中。一个声明的主语、属性和宾语依次出现,由句号结尾。
RDF/XML
RDF/XML是RDF在XML语言中的编码。允许RDF被已有XML处理工具使用。
<rdf:RDF xmlns:dbpedia-owl="http://dbpedia.org/ontology/"
xmlns:dbpedia="http://dbpedia.org/resource/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:swp="http://www.semanticwebprimer.org/ontology/apartments.ttl#">
<rdf:Description
rdf:about="http://www.semanticwebprimer.org/ontology/apartments.ttl#BaronWayAppartment">
<swp:hasNumberOfBedrooms
rdf:datatype="http:www.w3.org/2001/XMLSchema#integer">
3
<swp:hasNumberOfBedrooms>
rdf:Description>
RDFa
RDFa用来简化RDF描述和标注HTML网页。RDFa在HTML标签的属性(attribute)中嵌入RDF。
<html xmlns:dbpedia="http://dbpedia.org/resource/"
xmlns:dbpediaowl="http://dbpedia.org/ontology/"
xmlns:swp="http://www.semanticwebprimer.org/ontology/apartments.ttl#"
xmlns:geo="http://www.geonames.org/ontology#">
<body>
<H1>Baron Way Flat For SaleH1>
The Baron Way Flat has <span property="swp:hasNumberOfBedrooms">3span> bedrooms and is located in the family friendly <span rel="swp:isPartOf" resource="[swp:BaronWayBuilding]">Baron Way Buildingspan>
···
五、RDFS:添加语义
RDF既不假设与任何特定应用领域有关,也不定义任何领域的语义。用户需要通过RDF模式中定义的一组基本的领域无关的结构来定义其词汇表的含义。
类和属性
为了描述特定的领域,除了需要个体对象外,还有类,它定义了对象的类型。一个类可以视为一个元素的集合。RDF通过使用一个特殊属性rdf:type来定义实例和类之间的联系。类可以施加限制来约束在一个RDF文档中使用模式可以声明什么。
类层次和继承
一个类可以是另一个类的子类,也可以是另一个类的超类,还可以继承。RDF模式不要求所有的类形成一个严格的层次结构,即不一定是一棵树。
属性层次
对某个属性 P P P是 Q Q Q的子属性,仅当 P ( x , y ) P(x,y) P(x,y)成立时 Q ( x , y ) Q(x,y) Q(x,y)总成立。
RDF和RDFS的分层对比
下图中,方块是属性,虚线以上的圆圈是类,而虚线以下的圆圈是实例。
六、RDF模式:语言
RDF模式提供建模原语来表达信息,使用资源和属性定义。
核心类
- rdfs:Resource,所有资源的类
- rdfs:Class,所有类的类
- rdfs:Literal,所有文字(字符串)的类。
- rdf:Property,所有属性的类。
- rdf:Statement,所有具体化声明的类。
联系属性
- rdf:type,将一个资源关联到它的类。该资源被声明为该类的一个实例。
- rdfs:subClassOf,将一个类关联到它的超类。一个类的所有实例都是它的超类的实例。
- rdfs:subPropertyOf,将一个属性关联到它超属性中的一个。
限制属性
- rdfs:domain,指定一个属性 P P P的定义域,声明任何拥有某个给定属性的资源是定义域类的一个实例。
- rdfs:range,指定一个属性 P P P的值域,声明一个属性的取值是值域类的实例。
具体化属性
- rdf:subject,将一个具体化声明关联到它的主语。
- rdf:predicate,将一个具体化声明关联到它的谓语。
- rdf:object,将一个具体化属性关联到它的宾语。
容器类
- rdf:Bag,包的类
- rdf:Seq,序列的类。
- rdf:Alt,选择的类。
- rdfs:Container,所有容器类的超类,包括前面的3种。
效用属性
- rdfs:seeAlso,将一个资源关联到另一个解释它的资源。
- rdfs:isDefinedBy,rdfs:seeAlso的子属性,将一个资源关联到它的定义之处,一般是RDF模式。
- rdfs:comment,注释,一般是长的文本,可以与一个资源关联。
- rdfs:label,讲一个人类友好的标签(名字)与一个资源相关联。
七、将JSON文件转化为RDF
Python提供了RDF的API:rdflib库,可以将JSON格式(或者其它文本转化为dict)的数据信息构造为RDF模型。
首先读取json格式的数据,存入data变量中。
with open("json/orrigin_data.json", "rb") as jsonfile:
data = json.load(jsonfile)
通过rdflib构造Graph模型,并将json数据写入到模型中,最后用.rdf格式的文件存储。这个库所采用的RDF表示方式为RDF/XML。
mygraph = rdflib.Graph()
base_url = data["@context"].values()
print(base_url)
subdata = data["@graph"]
for item in subdata:
s = rdflib.URIRef(base_url + item['name'].replace(' ','-').replace('\\',''))
for key in item:
try:
txt = item[key]
p = rdflib.URIRef(base_url' + key.replace('@', ''))
if key == '@type':
for object in txt:
o = rdflib.URIRef(base_url' + object)
mygraph.add((s, p, o))
elif key == 'address':
o = rdflib.URIRef(base_url' + txt["addressCountry"].replace(' ','-'))
mygraph.add((s, p, o))
elif key == 'geo':
o = rdflib.URIRef(base_url' + txt["latitude"])
mygraph.add((s, p, o))
o = rdflib.URIRef(base_url' + txt["longitude"])
mygraph.add((s, p, o))
except Exception as e:
pass
构造完成后,将原始的json格式的数据以RDF/XML的形式呈现,并且添加了www.w3.org的命名空间。
<rdf:RDF
xmlns:ns1="http://www.openkg.cn/dataset/microeconomy/"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
>
<rdf:Description rdf:about="http://cnschema.org/Bata">
<ns1:geo rdf:resource="http://www.openkg.cn/dataset/microeconomy/1.905469"/>
<ns1:type rdf:resource="http://www.openkg.cn/dataset/microeconomy/Airport"/>
<ns1:address rdf:resource="http://www.openkg.cn/dataset/microeconomy/Equatorial-Guinea"/>
<ns1:type rdf:resource="http://www.openkg.cn/dataset/microeconomy/CivicStructure"/>
<ns1:geo rdf:resource="http://www.openkg.cn/dataset/microeconomy/9.805681"/>
<ns1:type rdf:resource="http://www.openkg.cn/dataset/microeconomy/Place"/>
<ns1:type rdf:resource="http://www.openkg.cn/dataset/microeconomy/Thing"/>
rdf:Description>
八、总结
- RDF为表示和处理及其可理解的数据提供了基础。
- RDF使用基于图的数据模型。它的核心概念包括资源、属性、声明和图。一个声明是一个资源-属性-值的三元组。
- RDF拥有三种标准语法(Turtle、RDF/XML和RDFa)来支持语法层的互操作性。
- RDF使用分布式思想,允许递增式的构建知识,以及知识的共享和复用。
- RDF是领域无关的,RDF模式提供了一种描述特定领域的机制。
- RDF模式是一种基本的本体语言。它提供一组具有固定含义的建模原语。RDF模式的核心概念有类、子类关系、属性、子属性关系,以及定义域和值域的限制。