funson的专栏

云海山人居

Semantic Web
SPARQL,和“sparkle”的发音一样,它是一种 RDF 查询语言,可以从 RDF 图中查询信息。在 W3C Technical Reports and Publications 页面上,我们可以看到,现在和 SPARQL 相关的共有三项内容:其中两个是 Candidate Recommendations(候选推荐),SPARQL Protocol for RDFSPARQL Query Results XML Format;另外一个是 Word Drafts(工作草案),SPARQL Query Language for RDF。上了这个页面,基本上就已经说明这个要成为 W3C 的推荐标准了,就像 RDF 和 OWL 一样。而且,在 WWW2006 发言时,TimBL 也已经表示,随着 SPARQL 查询语言即将完成标准化,语义网已经具备了成功所需要的所有标准和技术,Web开发人员和内容创作人员可以开始使用这些语义语言了。

在 SPARQL 之前,已经有不少研究人员致力于开发针对 RDF 的查询语言,在这个网页 http://www.w3.org/2001/11/13-RDF-Query-Rules/ 上有一个比较完整的列表。SPARQL 是基于以前的 RDF 查询语言(如rdfDB、RDQL 和 SeRQL)发展而来的,拥有一些有价值的新特性,并且受到 Jena 开发团队的鼎立支持。Jena 是 HP 公司语义网研究小组开发的一套 Java 工具包,用来支持人们进行语义网的相关研究和应用开发。SPARQL 的语法细节这里就不一一列举了,直接给出一个例子。总体来说,SPARQL 的语法和传统 SQL 的语法还是有几分相似的,大家应该不会陌生。
BASE <http://my.donews.com/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
# 这是一个以 BASE 为根的相对 IRI
PREFIX user: <users#>

SELECT ?person ?name ?age
FROM <users.rdf>
WHERE {
?person a foaf:Person ;
foaf:name ?name .
OPTIONAL { ?person user:age ?age } .
FILTER (REGEX(?name, “clickstone”))
}
ORDER BY ASC(?name)
LIMIT 10
OFFSET 10


简要的说明一下例子中出现的语法。
   1. BASE,根 IRI,其他以此为根的 IRI 就可以写成相对形式了,见例子里面的注释。一旦定义了 BASE,就可以在 SPARQL 的任何地方进行使用了,例子中共用到了 2 处。
   2. 使用 # 进行注释。
   3. PREFIX,IRI 前缀的缩写。
   4. SELECT,查询关键字,和 SQL 中的一个意思。
   5. ?person ?name ?age,要查询的变量,使用 ? 标识变量,也可以使用 $。变量间使用空白分隔(现在正在征集意见,正式标准中使用空白还是逗号分隔尚未最终确定)。
   6. FROM,从何处查询数据。可以一次查询多个 RDF 数据集,只需要使用 FROM 逐一列出即可。
   7. WHERE,过滤条件集合,和 SQL 的 WHERE 一个意思。
   8. ?person a foaf:Person,具体的过滤条件,使用 Turtle 语法。还记得“a”是什么意思吗?具体的介绍可以参看《RDF 实战》。
   9. 例子中两个过滤条件的主语都是“?person”,因此,使用了简写的形式。如果主语不同,逐一列出检索条件即可。
  10. OPTIONAL,可选过滤条件。比如有些 ?person 可能没有填写 age 属性,如果不使用 OPTIONAL,那么查询结果将不包含这些 ?person;使用了 OPTIONAL 关键字,没有填写 age 属性的 ?person,同样可以被查询到。
  11. FILTER (REGEX(?name, “clickstone”)),明确化的过滤条件,类似于 SQL 中的 LIKE、=、> 等的左右。例子中的意思是说,返回的 ?name 变量中,必须包含“clickstone”。
  12. ORDER BY,排序,可以指定多个排序,比如例子可以改为,ORDER BY ASC(?name) DESC(?age)。默认排序是 ASC。
  13. LIMIT 10,将返回结果限定在 10 条,类似于 SQL 中的 SELECT TOP 10。
  14. OFFSET 10,掠过前边的 10 条,从 第 11 条开始返回。这个功能比 SQL 强大,SQL 要自己写翻页。

其他的还有 UNION、DISTINCT 等的使用,大家就自己看文档吧。但必须强调一点,SPARQL 的使用中和 SQL 一个非常大的区别,需要大家注意:SELECT 子句中出现的变量,比如例子中的 ?person ?name ?age,在 WHERE 子句中必须全部出现。为什么会这样呢?因为对于一个 SPARQL 查询处理器来讲,它不具备类似于关系数据库中数据字典的东西以供参考,所以每一个 SELECT 的变量,在 WHERE 中必须指定一个用来匹配的triple。

这篇文章只是抛砖引玉,更详细的内容,还需要大家深入研究。推荐阅读:Introducing SPARQL: Querying the Semantic Web。欢迎互动交流。

Semantic Web:RDF实战

前面的几篇文章里,对 Sementic Web 的整体情况做了一些介绍。都是一些非常概念化的东西,刚开始接触 Semantic Web 的人可能不太容易理解。不过其实总结一下,核心概念主要是这么几个:RDF、OWL和Ontology。今天围绕 RDF 动手作一些练习。

先看一个简单的例子:http://my.donews.com/clickstone/index.html 这个网页的作者是 clickstone。这是我们使用自然语言的表达方法。使用 RDF,我们需要首先提取出这句话的主干意思。被描述的事物是 “http://my.donews.com/clickstone/index.html”;他有一个“作者”属性;属性的值是 “clickstone”。
RDF 正是基于这一思想:被描述的事物具有一些属性,这些属性各自有不同类型的值;对资源的描述可以通过对它作出指定了上述属性及值的陈述来进行(就像上面例子中的那样)。RDF 用一套特定的术语来表达陈述中的各个部分,简单地讲:被陈述的事物称为 “主体” (例如上例中的“http://my.donews.com/clickstone/index.html”);主题的属性称为“谓词”(例如上例中的 “作者”);属性的值成为“客体”(例如上例中的“clickstone”);主体、谓词和客体,构成一个“RDF 陈述”。

上一篇里,我们提到可以使用三种方法来表示这种陈述:图形、Notation3(N3)和XML。图形是最为形象直观的一种方法。RDF 可以将关于资源的陈述表示为一个由结点和弧组成的图,其中的弧的起始节点是主体资源;弧本身代表资源的属性;弧的结束节点是属性值,可以是原生值,也可以另外一个资源。还以“http://my.donews.com/clickstone/index.html”为主体,可以给出一组复杂一些的陈述:有一个网页他使用 http://my.donews.com/clickstone/index.html 作为标识,他的作者作者是clickstone,他的名称是 Beyond Search,他的主题是 Semantic Web。这组陈述可以使用图1表示。
RDF sample图1 RDF示例图
使用 RDF 的语言来描述图1:
1、主体为网页,他的URI标识为“http://my.donews.com/clickstone/index.html” 。
2、谓词为creator、title、subject 等,表示属性,属性也有URI标识,图上省略了。完整的属性URI标识图上给了一个例子,“http://www.w3.org/1999/02/22- rdf-syntax-ns#type”,其中属性名为 type,URI标识为 http://www.w3.org/1999/02/22-rdf-syntax-ns。
3、客体为clickstone、“Beyond Search”和“Semantic Web”,其类型不同。clickstone 表示一个实体属性,他是Person类的一个实例。“Beyond Search”通常被称为“原生值”,字符串、数字等都可以看作原生值。“Semantic Web”也可以看作一个“原生值”属性,所不同的是他给出了一个参考(refrences)资源。

计算机无法理解 RDF 的图形表示。为了用一种计算机可处理的方式来表示 RDF 陈述,RDF 定义了一种基于 XML 的描述语法,称为 RDF/XML。在RDF/XML 语言里,有一些已经定义好的元语可以使用。通常情况下,主体节点对应于一个 rdf:Description 节点,我们称之为“主体节点”,主体的 URI 作为主体节点的 rdf:about 属性的值。谓词的 URI 写为 XML QNames,以主体节点的子节点的形式编写,称之为“属性节点”。客体不作为独立的节点,根据类型不同,其 XML 表示形式也有所区别:一般的原生值,通常记做属性节点的内容;如果是一个资源值,通常在谓词节点中加入 rdf:resource 属性表示客体,其值为客体的 URI。例如,将图1使用RDF/XML可以表示为,

<rdf:RDF xmlns:rdf=”http://www.w3.org/1999/02/22-rdf-syntax-ns#”
xmlns:rdfs=”http://www.w3.org/2000/01/rdf-schema#”
xmlns:dc=”http://purl.org/dc/elements/1.1/”
xmlns:contact=”http://www.w3.org/2000/10/swap/pim/contact#”>

<rdf:Description rdf:about=”http://my.donews.com/clickstone/index.html”>
<dc:creator rdf:resource=”http://my.donews.com/users/clickstone”/>
<dc:title>Beyond Search</dc:title>
<dc:subject rdf:resource=”Semantic Web” />
</rdf:Description>
<rdf:Description rdf:about=”Semantic Web”>
<rdf:seeAlso rdf:resource=”http://www.w3.org/2001/sw/” />
</rdf:Description>
<contact:Person rdf:about=”http://my.donews.com/users/clickstone”/>

</rdf:RDF>

RDF/XML 有一个最大的问题,他不具备约束其结构的 XML Schema。RDF Schema 的名字让人很容易误以为是干这个用的,其实不是,他被称为“RDF 词汇描述语言”,和 XML Schema 的作用相去甚远。缺乏约束导致 RDF/XML 的写法没有标准,人们使用起来效果不是很好。

Notation 3,N3,是另外一种 RDF 表示方法,他相比 RDF/XML 大为简洁。他将 RDF 陈述写成一个依次为主体,谓词,客体的三元组形式。每一个三元组均对应于 RDF 图中的一条弧,且这个弧的起始节点和终止节点分别是陈述中的主体和客体。和图形表示法不同,三元组表示法要求一个节点在它出现的每个陈述中都要有标识。例如,“http://my.donews.com/clickstone/index.html 的作者是 clickstone”这个陈述,使用 N3 表示为,“ .”。注意,N3 写法中,末尾需要有一个“.”。上面这个例子看起来一点儿也不简洁,这主要是因为 URI 标识的原因。和 XML 的 Namespace 概念类似的,N3 中可以定义“前缀”,用“@prefix”来表示,例如,“@prefix dc: .”。将图1使用 N3 可以表示为,

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <xmlns:rdfs=”http://www.w3.org/2000/01/rdf-schema#> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix contact: <http://www.w3.org/2000/10/swap/pim/contact#> .
@prefix user: <http://my.donews.com/users/> .
@prefix cs: <http://my.donews.com/clickstone/> .
<cs:index.html> dc:creator user:clickstone .
user:clickstone rdf:type contact:Person .
<cs:index.html> dc:title “Beyond Search” .
<cs:index.html> dc:subject <Semantic Web> .
<Semantic Web> rdfs:seeAlso <http://www.w3.org/2001/sw/> .

在 N3 中,当对一个相同的主体你进行若干个陈述时,可以使用简化表示:用一个分号 “;” 引入相同主体的其他属性;用一个逗号引入相同主体及谓词的其他客体。另外,rdf:type 在 N3 中可以简写为“a”。
那么上面的 N3 表示可以简化为,

<cs:index.html> dc:creator user:clickstone ;
dc:title “Beyond Search” ;
dc:subject <Semantic Web> .
<Semantic Web> rdfs:seeAlso <http://www.w3.org/2001/sw/> .
user:clickstone a contact:Person .

Tim BL 写了一篇非常经典的 N3 教学文章,在这里“Primer: Getting into RDF & Semantic Web using N3”。另外,他还写了一个 Python 工具,可以进行 RDF/XML 与 N3 之间的转换,在这里“CWM”,但早先我把下载包解压后,cwm.py 文件是 0 字节,导致无法使用,我从 CVS 里面弄出来一个 win32 的安装程序,是 1.19 版的,可以使用。

Update:推荐阅读,The Bottoms Up RDF Tutorial

Semantic Web:语义网是如何运作的?

为了实现语义网智能化与自动化处理信息的目标,语义网的研究者们开发了许多新技术并提出了一系列的标准和规范。被广泛认可的语义网体系框架是由Tim Berners-Lee提出来的,如图1所示,自下而上共有7层。
图1 语义网体系框架
第1层:URI和Unicode,语义网的基础设施。
必须首先说一下URI(Uniform Resource Identifier),中文通常称作“统一资源标识符”,它是语义网的根基。同现在互联网使用URL标识HTML页面一样,语义网同样需要一个类似的规范,用来唯一标识网络上的资源。语义网使用URI规范,具体的规范在RFC 2396里进行了详细的说明。任何组织和个人都可以自由定义和使用URI。需要澄清的一个概念是,URI的使用与URL有很大区别。URL被用来标识一个网络路径,可以通过互联网在这个URL上访问到对应的资源;但一个URI所标识的资源可能根本无法通过网络访问到,它标识而且仅仅是标识一个资源,并不同时包含该资源的访问路径。从概念上来讲,URI包含URL。
Unicode想必大家都不陌生,它是一个字符集,这个字符集中所有的字符都用两个字节表示,可以表示65356个字符,基本上包括了世界上所有语言的字符。语义网的终极目标是构建一个全球信息网络,它必然涵盖各个国家、各个民族的语言,采用Unicode作为其字符编码方案,可以从根本上解决跨地区、跨语言字符编码的格式标准问题。
这一层是整个语义网的基础,URI负责资源的标识,Unicode负责资源的编码。

第2层:XML、Namespaces、XML Schema和XML Query,语义网的语法层。
XML已经成为数据表示和数据交换的事实标准,它提供一种格式自由的语法,用户可以按照自己的需要创建标记集,并使用这些标记编写XML文档。正因为任何人都可以自由定义标记,所以不可避免地就会发生标记同名的情况。W3C引入Namespaces,即命名空间,机制,在标记前面加上URI索引,从而消解这种冲突。例如,,其中标记就指定了“cs”命名空间,从而避免与其他博客的标记产生冲突。XML Schema提供了一种对XML文档进行数据校验的机制。它基于XML语法,提供多种数据类型,对XML标记的结构和使用方法进行了规范。XML Query是在XML基础上发展起来的技术标准,类似的还有XPath等,使用这些技术,可以对XML文档进行数据检索、提取节点等操作。
然而,随着XML在数据交换,应用集成等领域的广泛应用,人们逐渐发现,XML仅适用于描述表示数据的语法,却不能涵盖数据的语义。鉴于XML受到业界的普遍支持,并且已经具备了较完备的技术标准,在语义网体系框架中,将其作为数据表示的语法层。

第3层:RDF Model、RDF Schema和RDF Syntax,语义网的数据互操作层。
XML不适于表达数据的语义,因此,数据语义的定义和互操作,需要由更高一层来完成。因此,W3C组织开发出了一种新的语言,用来描述互联网上的资源及其之间的关系,这就是,资源描述框架 (Resource Description Framework,RDF)。RDF采用三元组,来表示互联网上的资源、属性及其值。在语义网概念里,这种三元组被称为RDF的“陈述(Statement)”:主体,即某个资源(Resource),的某个属性(Property)(谓词)的值是客体(某个资源,或者是原生值,如字符串)。
RDF提供了一套标准的数据语义描述规范,但它还需要定义描述中使用的词汇。RDF Schema(RDFS)提供了一种面向计算机理解的词汇定义,提供了描述类和属性的能力。RDFS在RDF的基础上引入了类、类之间的关系、属性之间的关系、以及属性的定义域与值域等。它就像一个字典,计算机通过它可以理解数据的含义。它有一个明显区别于对象模型的特点,属性是独立于类的,一个属性可以应用于多个类或者实例。
RDF Syntax构建了一套完整的语法以利于计算机进行自动分析和处理。它有三种常用的表示方法:图形、N3 和XML。其中,图形表示是对RDF模型的直接描述,通过RDF模型的图像化,可以直接明了的观察RDF数据及其关系;N3 是一种用三元组的方式,通过枚举RDF模型中的每个“陈述”来表述RDF模型,它最易于使用,简明易懂;RDF/XML 将RDF以XML语法描述,将XML的解析过程和解释过程相结合,这样,RDF在帮助解析器阅读XML的同时,可以获取XML所要表达的语义,并可以根据它们的关系进行推理,从而做出基于语义的判断。但是RDF/XML常常因为过于复杂、难以使用而受到指责。

第4层:Ontology,语义网的知识集合。
本体(Ontology)最早是一个哲学上的概念,从哲学的范畴来说,本体是客观存在的一个系统的解释或说明,关心的是客观现实的抽象本质。人工智能方面的研究人员最早将其引入了计算机领域。关于本体,一个最为流行的定义是,“本体是共享概念模型的形式化规范说明”。这包含4层含义:概念模型(conceptualization)、明确(explicit)、形式化(formal)和共享(share)。
1)概念模型(conceptualization):通过抽象出客观世界中一些现象的相关概念而得到的模型,其表示的含义独立于具体的环境状态。
2)明确(explicit):所使用的概念及使用这些概念的约束都有明确的定义。
3)形式化(formal):本体是计算机可读的。
4)共享(share):本体中体现的是共同认可的知识,反映的是相关领域中公认的概念集,它所针对的是团体而不是个体的共识。
本体的目标是提取领域知识,统一对某个领域知识的共同理解,确定该领域内共同认可的词汇,并从不同层次的形式化模式上给出这些词汇和词汇之间相互关系的明确定义。
作为语义网中最为核心的一层,本体层在RDF和RDFS进行基本的类/属性描述的基础之上,更进一步地描述了本体以及它们之间的关系。这一层有其专用的本体描述语言。历史上曾经出现的有一定影响的包括,SHOE(Simple HTML Ontology Language),OIL(Ontology Inference Language),DAML(DARPA Agent Markup Language),以及DAML+OIL。RDF也是一种简单的本体描述语言,但它的描述能力比较弱,需要进行扩展。OWL(Web Ontology Language)是W3C组织推荐的本体描述语言,它的实现比较多的参考了DAML+OIL的设计思想和经验。

第5层:Logic,规则及其描述方法是自动推理的基础。
语义网的一个重要目标,就是实现基于特定规则的自动推理。这是一项非常复杂的工作。起初,围绕着如何实现这个目标,甚至是能否实现这个目标,研究人员之间的争论非常激烈。一个典型的论题就是“RDF是否具备实现自动推理的能力?”,一些人认为RDF/RDFS缺乏进行量化运算的能力。
举个例子,如果你的好朋友说,“《阿干正传》是部好电影”,恰好你也看了《阿干正传》,并且和他的意见一致。这样,你会对好朋友的判断产生认同。这种肯定的认同会对你的推理发生作用。当他再次告诉我们,“《无极》无聊至极”之后,你就可以依据之间的结果对这个评论做出判断。
现实生活里,人们可以根据自己的亲身经历作出推理。在语义网中,研究者们需要把这个推理过程使用量化的方法加以实现和证明。近年来,随着研究工作的不断深入,描述逻辑(Description Logic, DL), 作为较为一种较为成熟的知识表示方法,被引入进来。它对OWL等规范的指定,起到了一定程度的指导作用。最近,研究人员已经开始尝试着在OWL 上加入规则形成OWL的规则语言ORL(OWL Rules Language),从而可以更好地进行自动推理工作。

第6层:Proof,推理结果应该是可以验证的。
目前,针对Proof层以及后面Trust层的研究成果还不是很多,但一个普遍的共识是,Proof和Trust是语义网领域内两个非常重要的研究课题。 Proof层使用Logic层定义的推理规则进行逻辑推理,得出某种结论。对于语义网的用户来讲,这个推理过程应该是建立在可靠的数据基础之上的,推理的过程应该是公开的,而且推理得到的结论也应该是可以验证的。
还使用上面的那个例子,我们经过推理,认为“《无极》不是一部好电影”。在现实生活里,我们可以亲自观看《无极》,并做成判断,对这个推理及其结论进行验证。而在语义网中,我们也必须具备这样的验证机制。在计算机的概念里,通常把类似于亲身经历的事情称作“上下文”。上下文是我们作出推理的基础,因此,语义网必须建立一种方法来证明推理所使用的上下文信息的准确性和真实性。

第7层:Trust,语义网应该是一个可以信任的网络。
在语义网内进行推理并最终得出的结论应该是可以信任的。这需要满足两点:(1)可以信任所见的数据,即上下文;(2)可以信任所作的推理过程。满足了这两点,才可以信任最终得到的推理结果。
使用语义网的RDF模型,任何人都可以对任何资源进行描述,不同立场的人对相同的资源可能会作出完全相反的描述。Trust层负责为应用程序提供一种机制,以决定是否信任给出的论证。Trust层的建立,使智能代理在网络上实现个性化服务,以及彼此间自动交互合作,具备了可靠性和安全性。

其他:Signature,数字签名。
数字签名位于层次模型的右侧,贯串了语义网的中间四层。数字签名是一种基于互联网的安全认证机制。当信息从一个层次传递到另一个层次时,可以使用数字签名说明信息的来源和安全性;这样,接收方就可以通过数字签名鉴别其来源和安全性,以决定信息的可信任程度。有了数字签名,一些重要的电子商务活动就可以放心地在语义网上进行了。其实不光对于语义网,数字签名对于所有的信息交换系统都非常重要。

Semantic Web:这是怎么个回事?

“石头”后遗症 ,这个成了口头禅了,呵呵。好了,言归正传。

Semantic Web通常被译为“语义网”,W3C组织是这么定义它的——The Semantic Web provides a common framework that allows data to be shared and reused across application, enterprise, and community boundaries.(语义网提供了一套通用框架,通过它,数据可以跨越边界,为各种应用程序,企业和社区所用。)

语义网是一个数据网络——a web of data。它主要完成两件事情:1、提供进行数据交换的通用格式;2、提供记录数据与实体映射关系的语言。语义网并不是一个全新的网络,它是现有互联网的扩展,它提供对数据的语义描述,使计算机能够自动“理解”网络上的数据,实现计算机之间的智能交互,从而使得互联网真正成为一个全球化的信息共享和智能服务平台成为可能。

语义网的概念是由Tim Berners-Lee提出的,他是互联网的创始人,发明了URI,HTTP和HTML,编写了第一个Web Server软件和第一个浏览器。在2000年的世界XML大会上,他进行了题为《The Semantic Web》的专题演讲,对语义网的概念进行了阐述,并首先给出了语义网的体系架构。2001年5月,《Scientific American》以封面文章,刊发了他的《The Semantic Web》一文,向人们描绘了语义网的美好前景,并对其中的主要技术进行了简要的说明。

能够得到这样重量级人物的大力推广,并被看作是“下一代互联网技术”,语义网自然发展迅速。在W3C里面,有专门的一个小组负责推进语义网的标准化工作,并且已经发布了不少相关的语言、论文和工具。在学术界,语义网也吸引了广泛的关注,相关的科研活动相当活跃。国际语义网会议(International Semantic Web Conference -ISWC) 和欧洲语义网会议(European Semantic Web Conference -ESWC),是目前国际上最高级别的学术会议,在语义网的理论研究和实践应用方面已取得了许多优秀成果。近两年,亚洲各国也已经越来越重视语义网这个研究领域。2006年9月,北京清华大学成功举办了“第一届亚洲语义网会议(Asian Semantic Web Conference -ASWC)”。有兴趣的朋友,可以去会议的官方网站(http://www.aswc2006.org/ )看看。

但尽管如此,因为语义网的实现太过复杂,目前已经取得的这些成就仍然只能算是一些铺垫而已,大家就它未来的发展方向也还远没有达成一致。

附一些语义网的研究资料:
1. W3C Semantic Web Activity,http://www.w3.org/2001/sw/
2. Semantic Web @ Wikipeida,http://en.wikipedia.org/wiki/Semantic_web/
3. 关注开发的朋友可以看看这里,http://www.w3.org/2001/sw/BestPractices/
4. 国际语义网会议官方站点,http://iswc.semanticweb.org/ 。明年第7届会议将在韩国釜山举办。
5. 第1届亚洲语义网会议官方站点,http://www.aswc2006.org/
6. Journal of Web Semantics,http://www.websemanticsjournal.org/
7. 国内也有一个,http://bbs.w3china.org/
8. 最好的语义网项目:FOAF(Friend of a Friend),http://rdfweb.org/

Beyond Search

最好走的路越走越难,最难走的路越走越容易

[置顶] Google 吴军:数学之美系列

Semantic Web: SPARQL——RDF查询语言

SPARQL,和“sparkle”的发音一样,它是一种 RDF 查询语言,可以从 RDF 图中查询信息。在 W3C Technical Reports and Publications 页面上,我们可以看到,现在和 SPARQL 相关的共有三项内容:其中两个是 Candidate Recommendations(候选推荐),SPARQL Protocol for RDFSPARQL Query Results XML Format;另外一个是 Word Drafts(工作草案),SPARQL Query Language for RDF。上了这个页面,基本上就已经说明这个要成为 W3C 的推荐标准了,就像 RDF 和 OWL 一样。而且,在 WWW2006 发言时,TimBL 也已经表示,随着 SPARQL 查询语言即将完成标准化,语义网已经具备了成功所需要的所有标准和技术,Web开发人员和内容创作人员可以开始使用这些语义语言了。

在 SPARQL 之前,已经有不少研究人员致力于开发针对 RDF 的查询语言,在这个网页 http://www.w3.org/2001/11/13-RDF-Query-Rules/ 上有一个比较完整的列表。SPARQL 是基于以前的 RDF 查询语言(如rdfDB、RDQL 和 SeRQL)发展而来的,拥有一些有价值的新特性,并且受到 Jena 开发团队的鼎立支持。Jena 是 HP 公司语义网研究小组开发的一套 Java 工具包,用来支持人们进行语义网的相关研究和应用开发。SPARQL 的语法细节这里就不一一列举了,直接给出一个例子。总体来说,SPARQL 的语法和传统 SQL 的语法还是有几分相似的,大家应该不会陌生。
BASE <http://my.donews.com/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
# 这是一个以 BASE 为根的相对 IRI
PREFIX user: <users#>

SELECT ?person ?name ?age
FROM <users.rdf>
WHERE {
?person a foaf:Person ;
foaf:name ?name .
OPTIONAL { ?person user:age ?age } .
FILTER (REGEX(?name, “clickstone”))
}
ORDER BY ASC(?name)
LIMIT 10
OFFSET 10


简要的说明一下例子中出现的语法。
   1. BASE,根 IRI,其他以此为根的 IRI 就可以写成相对形式了,见例子里面的注释。一旦定义了 BASE,就可以在 SPARQL 的任何地方进行使用了,例子中共用到了 2 处。
   2. 使用 # 进行注释。
   3. PREFIX,IRI 前缀的缩写。
   4. SELECT,查询关键字,和 SQL 中的一个意思。
   5. ?person ?name ?age,要查询的变量,使用 ? 标识变量,也可以使用 $。变量间使用空白分隔(现在正在征集意见,正式标准中使用空白还是逗号分隔尚未最终确定)。
   6. FROM,从何处查询数据。可以一次查询多个 RDF 数据集,只需要使用 FROM 逐一列出即可。
   7. WHERE,过滤条件集合,和 SQL 的 WHERE 一个意思。
   8. ?person a foaf:Person,具体的过滤条件,使用 Turtle 语法。还记得“a”是什么意思吗?具体的介绍可以参看《RDF 实战》。
   9. 例子中两个过滤条件的主语都是“?person”,因此,使用了简写的形式。如果主语不同,逐一列出检索条件即可。
  10. OPTIONAL,可选过滤条件。比如有些 ?person 可能没有填写 age 属性,如果不使用 OPTIONAL,那么查询结果将不包含这些 ?person;使用了 OPTIONAL 关键字,没有填写 age 属性的 ?person,同样可以被查询到。
  11. FILTER (REGEX(?name, “clickstone”)),明确化的过滤条件,类似于 SQL 中的 LIKE、=、> 等的左右。例子中的意思是说,返回的 ?name 变量中,必须包含“clickstone”。
  12. ORDER BY,排序,可以指定多个排序,比如例子可以改为,ORDER BY ASC(?name) DESC(?age)。默认排序是 ASC。
  13. LIMIT 10,将返回结果限定在 10 条,类似于 SQL 中的 SELECT TOP 10。
  14. OFFSET 10,掠过前边的 10 条,从 第 11 条开始返回。这个功能比 SQL 强大,SQL 要自己写翻页。

其他的还有 UNION、DISTINCT 等的使用,大家就自己看文档吧。但必须强调一点,SPARQL 的使用中和 SQL 一个非常大的区别,需要大家注意:SELECT 子句中出现的变量,比如例子中的 ?person ?name ?age,在 WHERE 子句中必须全部出现。为什么会这样呢?因为对于一个 SPARQL 查询处理器来讲,它不具备类似于关系数据库中数据字典的东西以供参考,所以每一个 SELECT 的变量,在 WHERE 中必须指定一个用来匹配的triple。

这篇文章只是抛砖引玉,更详细的内容,还需要大家深入研究。推荐阅读:Introducing SPARQL: Querying the Semantic Web。欢迎互动交流。

Semantic Web:RDF实战

前面的几篇文章里,对 Sementic Web 的整体情况做了一些介绍。都是一些非常概念化的东西,刚开始接触 Semantic Web 的人可能不太容易理解。不过其实总结一下,核心概念主要是这么几个:RDF、OWL和Ontology。今天围绕 RDF 动手作一些练习。

先看一个简单的例子:http://my.donews.com/clickstone/index.html 这个网页的作者是 clickstone。这是我们使用自然语言的表达方法。使用 RDF,我们需要首先提取出这句话的主干意思。被描述的事物是 “http://my.donews.com/clickstone/index.html”;他有一个“作者”属性;属性的值是 “clickstone”。
RDF 正是基于这一思想:被描述的事物具有一些属性,这些属性各自有不同类型的值;对资源的描述可以通过对它作出指定了上述属性及值的陈述来进行(就像上面例子中的那样)。RDF 用一套特定的术语来表达陈述中的各个部分,简单地讲:被陈述的事物称为 “主体” (例如上例中的“http://my.donews.com/clickstone/index.html”);主题的属性称为“谓词”(例如上例中的 “作者”);属性的值成为“客体”(例如上例中的“clickstone”);主体、谓词和客体,构成一个“RDF 陈述”。

上一篇里,我们提到可以使用三种方法来表示这种陈述:图形、Notation3(N3)和XML。图形是最为形象直观的一种方法。RDF 可以将关于资源的陈述表示为一个由结点和弧组成的图,其中的弧的起始节点是主体资源;弧本身代表资源的属性;弧的结束节点是属性值,可以是原生值,也可以另外一个资源。还以“http://my.donews.com/clickstone/index.html”为主体,可以给出一组复杂一些的陈述:有一个网页他使用 http://my.donews.com/clickstone/index.html 作为标识,他的作者作者是clickstone,他的名称是 Beyond Search,他的主题是 Semantic Web。这组陈述可以使用图1表示。
RDF sample图1 RDF示例图
使用 RDF 的语言来描述图1:
1、主体为网页,他的URI标识为“http://my.donews.com/clickstone/index.html” 。
2、谓词为creator、title、subject 等,表示属性,属性也有URI标识,图上省略了。完整的属性URI标识图上给了一个例子,“http://www.w3.org/1999/02/22- rdf-syntax-ns#type”,其中属性名为 type,URI标识为 http://www.w3.org/1999/02/22-rdf-syntax-ns。
3、客体为clickstone、“Beyond Search”和“Semantic Web”,其类型不同。clickstone 表示一个实体属性,他是Person类的一个实例。“Beyond Search”通常被称为“原生值”,字符串、数字等都可以看作原生值。“Semantic Web”也可以看作一个“原生值”属性,所不同的是他给出了一个参考(refrences)资源。

计算机无法理解 RDF 的图形表示。为了用一种计算机可处理的方式来表示 RDF 陈述,RDF 定义了一种基于 XML 的描述语法,称为 RDF/XML。在RDF/XML 语言里,有一些已经定义好的元语可以使用。通常情况下,主体节点对应于一个 rdf:Description 节点,我们称之为“主体节点”,主体的 URI 作为主体节点的 rdf:about 属性的值。谓词的 URI 写为 XML QNames,以主体节点的子节点的形式编写,称之为“属性节点”。客体不作为独立的节点,根据类型不同,其 XML 表示形式也有所区别:一般的原生值,通常记做属性节点的内容;如果是一个资源值,通常在谓词节点中加入 rdf:resource 属性表示客体,其值为客体的 URI。例如,将图1使用RDF/XML可以表示为,

<rdf:RDF xmlns:rdf=”http://www.w3.org/1999/02/22-rdf-syntax-ns#”
xmlns:rdfs=”http://www.w3.org/2000/01/rdf-schema#”
xmlns:dc=”http://purl.org/dc/elements/1.1/”
xmlns:contact=”http://www.w3.org/2000/10/swap/pim/contact#”>

<rdf:Description rdf:about=”http://my.donews.com/clickstone/index.html”>
<dc:creator rdf:resource=”http://my.donews.com/users/clickstone”/>
<dc:title>Beyond Search</dc:title>
<dc:subject rdf:resource=”Semantic Web” />
</rdf:Description>
<rdf:Description rdf:about=”Semantic Web”>
<rdf:seeAlso rdf:resource=”http://www.w3.org/2001/sw/” />
</rdf:Description>
<contact:Person rdf:about=”http://my.donews.com/users/clickstone”/>

</rdf:RDF>

RDF/XML 有一个最大的问题,他不具备约束其结构的 XML Schema。RDF Schema 的名字让人很容易误以为是干这个用的,其实不是,他被称为“RDF 词汇描述语言”,和 XML Schema 的作用相去甚远。缺乏约束导致 RDF/XML 的写法没有标准,人们使用起来效果不是很好。

Notation 3,N3,是另外一种 RDF 表示方法,他相比 RDF/XML 大为简洁。他将 RDF 陈述写成一个依次为主体,谓词,客体的三元组形式。每一个三元组均对应于 RDF 图中的一条弧,且这个弧的起始节点和终止节点分别是陈述中的主体和客体。和图形表示法不同,三元组表示法要求一个节点在它出现的每个陈述中都要有标识。例如,“http://my.donews.com/clickstone/index.html 的作者是 clickstone”这个陈述,使用 N3 表示为,“ .”。注意,N3 写法中,末尾需要有一个“.”。上面这个例子看起来一点儿也不简洁,这主要是因为 URI 标识的原因。和 XML 的 Namespace 概念类似的,N3 中可以定义“前缀”,用“@prefix”来表示,例如,“@prefix dc: .”。将图1使用 N3 可以表示为,

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <xmlns:rdfs=”http://www.w3.org/2000/01/rdf-schema#> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .
@prefix contact: <http://www.w3.org/2000/10/swap/pim/contact#> .
@prefix user: <http://my.donews.com/users/> .
@prefix cs: <http://my.donews.com/clickstone/> .
<cs:index.html> dc:creator user:clickstone .
user:clickstone rdf:type contact:Person .
<cs:index.html> dc:title “Beyond Search” .
<cs:index.html> dc:subject <Semantic Web> .
<Semantic Web> rdfs:seeAlso <http://www.w3.org/2001/sw/> .

在 N3 中,当对一个相同的主体你进行若干个陈述时,可以使用简化表示:用一个分号 “;” 引入相同主体的其他属性;用一个逗号引入相同主体及谓词的其他客体。另外,rdf:type 在 N3 中可以简写为“a”。
那么上面的 N3 表示可以简化为,

<cs:index.html> dc:creator user:clickstone ;
dc:title “Beyond Search” ;
dc:subject <Semantic Web> .
<Semantic Web> rdfs:seeAlso <http://www.w3.org/2001/sw/> .
user:clickstone a contact:Person .

Tim BL 写了一篇非常经典的 N3 教学文章,在这里“Primer: Getting into RDF & Semantic Web using N3”。另外,他还写了一个 Python 工具,可以进行 RDF/XML 与 N3 之间的转换,在这里“CWM”,但早先我把下载包解压后,cwm.py 文件是 0 字节,导致无法使用,我从 CVS 里面弄出来一个 win32 的安装程序,是 1.19 版的,可以使用。

Update:推荐阅读,The Bottoms Up RDF Tutorial

Semantic Web:语义网是如何运作的?

为了实现语义网智能化与自动化处理信息的目标,语义网的研究者们开发了许多新技术并提出了一系列的标准和规范。被广泛认可的语义网体系框架是由Tim Berners-Lee提出来的,如图1所示,自下而上共有7层。
图1 语义网体系框架
第1层:URI和Unicode,语义网的基础设施。
必须首先说一下URI(Uniform Resource Identifier),中文通常称作“统一资源标识符”,它是语义网的根基。同现在互联网使用URL标识HTML页面一样,语义网同样需要一个类似的规范,用来唯一标识网络上的资源。语义网使用URI规范,具体的规范在RFC 2396里进行了详细的说明。任何组织和个人都可以自由定义和使用URI。需要澄清的一个概念是,URI的使用与URL有很大区别。URL被用来标识一个网络路径,可以通过互联网在这个URL上访问到对应的资源;但一个URI所标识的资源可能根本无法通过网络访问到,它标识而且仅仅是标识一个资源,并不同时包含该资源的访问路径。从概念上来讲,URI包含URL。
Unicode想必大家都不陌生,它是一个字符集,这个字符集中所有的字符都用两个字节表示,可以表示65356个字符,基本上包括了世界上所有语言的字符。语义网的终极目标是构建一个全球信息网络,它必然涵盖各个国家、各个民族的语言,采用Unicode作为其字符编码方案,可以从根本上解决跨地区、跨语言字符编码的格式标准问题。
这一层是整个语义网的基础,URI负责资源的标识,Unicode负责资源的编码。

第2层:XML、Namespaces、XML Schema和XML Query,语义网的语法层。
XML已经成为数据表示和数据交换的事实标准,它提供一种格式自由的语法,用户可以按照自己的需要创建标记集,并使用这些标记编写XML文档。正因为任何人都可以自由定义标记,所以不可避免地就会发生标记同名的情况。W3C引入Namespaces,即命名空间,机制,在标记前面加上URI索引,从而消解这种冲突。例如,,其中标记就指定了“cs”命名空间,从而避免与其他博客的标记产生冲突。XML Schema提供了一种对XML文档进行数据校验的机制。它基于XML语法,提供多种数据类型,对XML标记的结构和使用方法进行了规范。XML Query是在XML基础上发展起来的技术标准,类似的还有XPath等,使用这些技术,可以对XML文档进行数据检索、提取节点等操作。
然而,随着XML在数据交换,应用集成等领域的广泛应用,人们逐渐发现,XML仅适用于描述表示数据的语法,却不能涵盖数据的语义。鉴于XML受到业界的普遍支持,并且已经具备了较完备的技术标准,在语义网体系框架中,将其作为数据表示的语法层。

第3层:RDF Model、RDF Schema和RDF Syntax,语义网的数据互操作层。
XML不适于表达数据的语义,因此,数据语义的定义和互操作,需要由更高一层来完成。因此,W3C组织开发出了一种新的语言,用来描述互联网上的资源及其之间的关系,这就是,资源描述框架 (Resource Description Framework,RDF)。RDF采用三元组,来表示互联网上的资源、属性及其值。在语义网概念里,这种三元组被称为RDF的“陈述(Statement)”:主体,即某个资源(Resource),的某个属性(Property)(谓词)的值是客体(某个资源,或者是原生值,如字符串)。
RDF提供了一套标准的数据语义描述规范,但它还需要定义描述中使用的词汇。RDF Schema(RDFS)提供了一种面向计算机理解的词汇定义,提供了描述类和属性的能力。RDFS在RDF的基础上引入了类、类之间的关系、属性之间的关系、以及属性的定义域与值域等。它就像一个字典,计算机通过它可以理解数据的含义。它有一个明显区别于对象模型的特点,属性是独立于类的,一个属性可以应用于多个类或者实例。
RDF Syntax构建了一套完整的语法以利于计算机进行自动分析和处理。它有三种常用的表示方法:图形、N3 和XML。其中,图形表示是对RDF模型的直接描述,通过RDF模型的图像化,可以直接明了的观察RDF数据及其关系;N3 是一种用三元组的方式,通过枚举RDF模型中的每个“陈述”来表述RDF模型,它最易于使用,简明易懂;RDF/XML 将RDF以XML语法描述,将XML的解析过程和解释过程相结合,这样,RDF在帮助解析器阅读XML的同时,可以获取XML所要表达的语义,并可以根据它们的关系进行推理,从而做出基于语义的判断。但是RDF/XML常常因为过于复杂、难以使用而受到指责。

第4层:Ontology,语义网的知识集合。
本体(Ontology)最早是一个哲学上的概念,从哲学的范畴来说,本体是客观存在的一个系统的解释或说明,关心的是客观现实的抽象本质。人工智能方面的研究人员最早将其引入了计算机领域。关于本体,一个最为流行的定义是,“本体是共享概念模型的形式化规范说明”。这包含4层含义:概念模型(conceptualization)、明确(explicit)、形式化(formal)和共享(share)。
1)概念模型(conceptualization):通过抽象出客观世界中一些现象的相关概念而得到的模型,其表示的含义独立于具体的环境状态。
2)明确(explicit):所使用的概念及使用这些概念的约束都有明确的定义。
3)形式化(formal):本体是计算机可读的。
4)共享(share):本体中体现的是共同认可的知识,反映的是相关领域中公认的概念集,它所针对的是团体而不是个体的共识。
本体的目标是提取领域知识,统一对某个领域知识的共同理解,确定该领域内共同认可的词汇,并从不同层次的形式化模式上给出这些词汇和词汇之间相互关系的明确定义。
作为语义网中最为核心的一层,本体层在RDF和RDFS进行基本的类/属性描述的基础之上,更进一步地描述了本体以及它们之间的关系。这一层有其专用的本体描述语言。历史上曾经出现的有一定影响的包括,SHOE(Simple HTML Ontology Language),OIL(Ontology Inference Language),DAML(DARPA Agent Markup Language),以及DAML+OIL。RDF也是一种简单的本体描述语言,但它的描述能力比较弱,需要进行扩展。OWL(Web Ontology Language)是W3C组织推荐的本体描述语言,它的实现比较多的参考了DAML+OIL的设计思想和经验。

第5层:Logic,规则及其描述方法是自动推理的基础。
语义网的一个重要目标,就是实现基于特定规则的自动推理。这是一项非常复杂的工作。起初,围绕着如何实现这个目标,甚至是能否实现这个目标,研究人员之间的争论非常激烈。一个典型的论题就是“RDF是否具备实现自动推理的能力?”,一些人认为RDF/RDFS缺乏进行量化运算的能力。
举个例子,如果你的好朋友说,“《阿干正传》是部好电影”,恰好你也看了《阿干正传》,并且和他的意见一致。这样,你会对好朋友的判断产生认同。这种肯定的认同会对你的推理发生作用。当他再次告诉我们,“《无极》无聊至极”之后,你就可以依据之间的结果对这个评论做出判断。
现实生活里,人们可以根据自己的亲身经历作出推理。在语义网中,研究者们需要把这个推理过程使用量化的方法加以实现和证明。近年来,随着研究工作的不断深入,描述逻辑(Description Logic, DL), 作为较为一种较为成熟的知识表示方法,被引入进来。它对OWL等规范的指定,起到了一定程度的指导作用。最近,研究人员已经开始尝试着在OWL 上加入规则形成OWL的规则语言ORL(OWL Rules Language),从而可以更好地进行自动推理工作。

第6层:Proof,推理结果应该是可以验证的。
目前,针对Proof层以及后面Trust层的研究成果还不是很多,但一个普遍的共识是,Proof和Trust是语义网领域内两个非常重要的研究课题。 Proof层使用Logic层定义的推理规则进行逻辑推理,得出某种结论。对于语义网的用户来讲,这个推理过程应该是建立在可靠的数据基础之上的,推理的过程应该是公开的,而且推理得到的结论也应该是可以验证的。
还使用上面的那个例子,我们经过推理,认为“《无极》不是一部好电影”。在现实生活里,我们可以亲自观看《无极》,并做成判断,对这个推理及其结论进行验证。而在语义网中,我们也必须具备这样的验证机制。在计算机的概念里,通常把类似于亲身经历的事情称作“上下文”。上下文是我们作出推理的基础,因此,语义网必须建立一种方法来证明推理所使用的上下文信息的准确性和真实性。

第7层:Trust,语义网应该是一个可以信任的网络。
在语义网内进行推理并最终得出的结论应该是可以信任的。这需要满足两点:(1)可以信任所见的数据,即上下文;(2)可以信任所作的推理过程。满足了这两点,才可以信任最终得到的推理结果。
使用语义网的RDF模型,任何人都可以对任何资源进行描述,不同立场的人对相同的资源可能会作出完全相反的描述。Trust层负责为应用程序提供一种机制,以决定是否信任给出的论证。Trust层的建立,使智能代理在网络上实现个性化服务,以及彼此间自动交互合作,具备了可靠性和安全性。

其他:Signature,数字签名。
数字签名位于层次模型的右侧,贯串了语义网的中间四层。数字签名是一种基于互联网的安全认证机制。当信息从一个层次传递到另一个层次时,可以使用数字签名说明信息的来源和安全性;这样,接收方就可以通过数字签名鉴别其来源和安全性,以决定信息的可信任程度。有了数字签名,一些重要的电子商务活动就可以放心地在语义网上进行了。其实不光对于语义网,数字签名对于所有的信息交换系统都非常重要。

Semantic Web:这是怎么个回事?

“石头”后遗症 ,这个成了口头禅了,呵呵。好了,言归正传。

Semantic Web通常被译为“语义网”,W3C组织是这么定义它的——The Semantic Web provides a common framework that allows data to be shared and reused across application, enterprise, and community boundaries.(语义网提供了一套通用框架,通过它,数据可以跨越边界,为各种应用程序,企业和社区所用。)

语义网是一个数据网络——a web of data。它主要完成两件事情:1、提供进行数据交换的通用格式;2、提供记录数据与实体映射关系的语言。语义网并不是一个全新的网络,它是现有互联网的扩展,它提供对数据的语义描述,使计算机能够自动“理解”网络上的数据,实现计算机之间的智能交互,从而使得互联网真正成为一个全球化的信息共享和智能服务平台成为可能。

语义网的概念是由Tim Berners-Lee提出的,他是互联网的创始人,发明了URI,HTTP和HTML,编写了第一个Web Server软件和第一个浏览器。在2000年的世界XML大会上,他进行了题为《The Semantic Web》的专题演讲,对语义网的概念进行了阐述,并首先给出了语义网的体系架构。2001年5月,《Scientific American》以封面文章,刊发了他的《The Semantic Web》一文,向人们描绘了语义网的美好前景,并对其中的主要技术进行了简要的说明。

能够得到这样重量级人物的大力推广,并被看作是“下一代互联网技术”,语义网自然发展迅速。在W3C里面,有专门的一个小组负责推进语义网的标准化工作,并且已经发布了不少相关的语言、论文和工具。在学术界,语义网也吸引了广泛的关注,相关的科研活动相当活跃。国际语义网会议(International Semantic Web Conference -ISWC) 和欧洲语义网会议(European Semantic Web Conference -ESWC),是目前国际上最高级别的学术会议,在语义网的理论研究和实践应用方面已取得了许多优秀成果。近两年,亚洲各国也已经越来越重视语义网这个研究领域。2006年9月,北京清华大学成功举办了“第一届亚洲语义网会议(Asian Semantic Web Conference -ASWC)”。有兴趣的朋友,可以去会议的官方网站(http://www.aswc2006.org/ )看看。

但尽管如此,因为语义网的实现太过复杂,目前已经取得的这些成就仍然只能算是一些铺垫而已,大家就它未来的发展方向也还远没有达成一致。

附一些语义网的研究资料:
1. W3C Semantic Web Activity,http://www.w3.org/2001/sw/
2. Semantic Web @ Wikipeida,http://en.wikipedia.org/wiki/Semantic_web/
3. 关注开发的朋友可以看看这里,http://www.w3.org/2001/sw/BestPractices/
4. 国际语义网会议官方站点,http://iswc.semanticweb.org/ 。明年第7届会议将在韩国釜山举办。
5. 第1届亚洲语义网会议官方站点,http://www.aswc2006.org/
6. Journal of Web Semantics,http://www.websemanticsjournal.org/
7. 国内也有一个,http://bbs.w3china.org/
8. 最好的语义网项目:FOAF(Friend of a Friend),http://rdfweb.org/
 
阅读更多
个人分类: 智能搜索技术
想对作者说点什么? 我来说一句

A Developer's Guide to the Semantic Web

2014年12月04日 8.6MB 下载

Foundations Of Semantic Web Technologies

2017年11月26日 4.19MB 下载

Semantic Web Programming

2010年07月19日 5.72MB 下载

WEB 3.0与SEMANTIC WEB编程中文版

2018年03月06日 51.64MB 下载

Handbook of Semantic Web Technologies

2016年06月11日 11.51MB 下载

没有更多推荐了,返回首页

不良信息举报

Semantic Web

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭