地址:http://www.w3.org/2000/10/swap/Primer
Subject, verb and object主语、谓语和宾语
在RDF中,信息就是简单的带有主谓宾的一个语句集。在N3中你可以通过一个带句号的三元组表示,如 <#pat> <#knows> <#jo> .
任何事物,不管是主语、谓语还是宾语,都能用一个URI(Uniform Resource Identifier)辨认,如<http://www.w3.org/> or <http://www.w3.org/2000/10/swap/test/s1.n3#includes>。如果没有了#前面的东西,它便指当前文档内的事物。
例外:宾语(也只有宾语)可以是指字面的意思,比如字符串或整数。
e.g. <#pat> <#knows> <#jo> .以及<#pat> <#age> 24 .
动词”knows”在RDF中被称为属性,用来表示两个事物间的关系。你可以这样写:<#pat> <#child> <#al> .为了增加可读性也可以写成这样:<#pat> has <#child> <#al> .
或者<#al> is <#child> of <#pat> .
窍门:分号引出同一主语的另一属性,逗号引出在相同谓词和主语条件下的另一个宾语,如
<#pat> <#child> <#al>, <#chaz>, <#mo> ;
<#age> 24 ;
<#eyecolor> "blue" .
有一表格: age eyecolor
Pat 24 blue
al 3 green
jo 5 green
可以写成: <#pat> <#age> 24; <#eyecolor> "blue" .
<#al> <#age> 3; <#eyecolor> "green" .
<#jo> <#age> 5; <#eyecolor> "green" .
有时,描述一些存在的事物时,不给它们标识符,只给出属性,这时可以用方括号把这些属性括起来:<#pat> <#child> [ <#age> 4 ] , [ <#age> 3 ]. 即#pat有一个4岁的孩子和一个3岁的孩子。
有两点需要记住:
l 标识符仅仅是标识符,字母pat并没有告诉任何人或机器我们讨论的是一个名叫Pat的人,除非我们这样表示:<#pat> <#name> "Pat" 对于动词同理。
l 方括号声明了带有某些属性的事物存在,但是没有给出一个方法在当前文档里或其他文档里指向这些事物。
通过使用name,我们重新描述一下前面表格中的数据:
[ <#name> "Pat"; <#age> 24; <#eyecolor> "blue" ].
[ <#name> "Al" ; <#age> 3; <#eyecolor> "green" ].
[ <#name> "Jo" ; <#age> 5; <#eyecolor> "green" ].
Sharing concepts分享概念
语义网不能在一个文档里定义某物是什么意思,这事儿你只能用英语(或者偶尔用数学)来完成,我们实际上是通过”title”的概念进行交流。在语义网里我们就是使用相同的URI来分享概念。使用N3可以这样定义title:<> <#title> "A simple example of N3".(空尖括号<>通常指当前所在的文档)<#title>指它所在文档定义的概念#title。有一组人定义了title的一组属性,称谓Dublin Core,并给出了标识:<http://purl.org/dc/elements/1.1/title>
所以现在定义标题有了更好的方式:
<> <http://purl.org/dc/elements/1.1/title>
"Primer - Getting into the Semantic Web and RDF using N3".
当然这样做很啰嗦,想像一下通过这么长的标识符定义上面提到的每样东西#age和#eyecolor。所以N3允许你定义前缀@prefix,也称为命名空间namespace,以此缩短那些冗长的URI:
@prefix dc: <http://purl.org/dc/elements/1.1/> .
<> dc:title
"Primer - Getting into the Semantic Web and RDF using N3".
使用前缀,不仅节省了空间和时间,也不需要使用尖括号了。在N3中,你会经常使用它。在RDF、RDF Schema和OWL中最常用的几个命名空间:
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
也可以定义空前缀表示当前文档: @prefix : <#> .
上面的例子就可以写成这样了::pat :child [ :age 4 ] , [ :age 3 ].
Making vocabularies
上面类似于dc:title的都是RDF Properties。当你定义了一个新词汇时,你就定义了一个新类和新属性;当你说一个事物是什么类型时,你是在说它属于什么类。告诉你某物是什么类型的属性是rdf:type,它在N3中的缩写是a。所以我们可以这样定义关于个人的类:
:Person a refs:Class
在同一文档中,就可以这样介绍一个真实的人了:
:Pat a :Person
一个对象可能属于很多个类,他们之间不需要有等级关系,考虑一下Person, AnimateObject, Animal, TallPerson, Friend等。如果两个类之间有某种关系,可以进行指定,比如:
:Woman a rdfs:Class; rdfs:subClassOf :Person .
属性property用于声明两个事物之间的关系。
:sister a rdf:Property .
如果任何属性的主语都在一个类里,这个类就是属性的定义域;如果宾语都在一个类里,这个类就称为属性的值域。
:sister rdfs:domain :Person;
Rdfs:range :Woman
注意:类识别符以大写字母开头,属性property以小写字母开头。这只是一种惯例,并不是必需的。另外,因为rdfs:range和rdfs:domain本身都是rdf:Property,所以:sister也是rdf:Property,而且不需要显示声明。
等价Equivalence
当你定义一个词汇的时候,你很难意识到之前是否定义了一个类似的术语。两个术语间的等价性很有用,在N3中用“=”表示。
:Woman = foo:FemaleAdult .
:Title a red:Property; = dc:title
提示:尽可能使用他人已经定义好的词汇,这样有助于交换数据。当你定义的词汇中有同义词时,就要用等价性进行声明。
选择命名空间,发布你的词汇集Choosing a namespace and publishing your vacabulary
好的词汇术语的在线文档,能帮助人们读写RDF数据。作者必须明白一个术语的期望使用方式;读者(使用者)必须明白这个术语的期望含义。使用这些术语的软件开发者必须清晰地知道每个URI的含义是什么。
如果你使用RDF Schema和OWL词汇集定义你自己的词汇,那么你的文档在很多有趣和有用的方面都是机器可阅读的。这种使用RDF定义的RDF文档也被称为schema或者ontology。
帮助人们找到你的文档的最简单的方法就是,在Web浏览器中能够打开你为词汇术语定义的URI。如果你遵循我们在这里使用的命名约定,词汇定义有一个像这样的URI:http://example.com/terms而且它指向一个类似<#Woman>的术语,那么这就自动发生了。
理想情况下,你应该这样在网络上发布你的文档:using a server and portion of URI-space which are owned by an organization which can commit to maintaining them well into the future。在URI中引入当前的年份,这个约定能带来稳定性。某一天,当人们想重新使用http://example.com/food-vocabulary
时
,他们可能只能
使用
http://example.com/2003/food-vocabulary
,而这对文档的更新相当重要。在某些情况下,通过使用特定的域名(这些域名
may be insulated from possible organizational renaming and trademark issues
),能够获得更好的稳定性。