在谈论语义网的时候,要和RDF路线区分开来。
和一些人谈到语义网,他们说:“语义网死了”。如果从RDF的角度来说,是的——虽然W3C路线的支持者还不承认。
但是这种观点,就如同计算机在只有机器语言,没有高级语言的时候就断言:“计算机死了”。
我大胆提出两个假设
- RDF是一门低级语言,只适合机器使用——如同机器语言或者汇编语言
- 语义网需要一门高级语言,面向工程师(人),用来做大规模知识库的写作、重用
为什么说RDF是低级机器语言?
- 用URL来寻址并不错。但是把精确寻址的任务交给人,要求人来设计URL,就如同在C编程中要求人对每个变量赋予内存地址。
- RDF是一个“平坦”(flat)的语言,缺少内部的组织单元。有很多建议,引入诸如package, named graph这样的组织单元,但目前还没有达成共识或广泛采用。
- RDF的语法,即使是Turtle,也没有可读性,理解和重用起来非常困难。
- RDF缺少“宏”或者构造高层次组织的能力。其实SPARQL弥补了一点,就是graph pattern;一些语言如SPIN,把graph pattern作为可重用的单元,甚至可以生成新的数据。如果把这个能力作为RDF原生的能力就好了。
2010年RDF Working Group开预备会议,我也与会了。现在回来看,我那时的想法是错误的:为RDF引入更精确的语义,基于上下文(context)的组织和寻址,并不合适——虽然Pat Hayes后来很喜欢这个想法并在工作组内推一个类似的想法。
RDF的问题不是逻辑太少了,而是逻辑太多了。
知识工程的问题往往是太多考虑机器的需要,而不太考虑人的需要。而知识工程的瓶颈,又恰恰在人而不在机器。
RDF 1.1现在的几个努力方向:JSON语法,Named Graph, Turtle Syntax,这些都是好的。但是还不够。我甚至怀疑,在RDF框架内能不能达到易用性的目的。
因为从一开始,RDF就被设计成machine understandable语言。这本是好的,至少在1999年。但是一个缺少高级语言的情况,就好像编程语言的早期。结果就是知识工程的人月神话。
现在的情况也很象Web发明的时候:在Internet上,TCP/IP是面向机器的低级语言,而HTML和URL是面向人的高级语言。我觉得,现在有一个强烈的需要来设计一个Semantic Web的高级语言。
这样的高级语言要有什么特征呢?我觉得大体有这样几点
- 支持多粒度的知识/数据组织和重用
- 用字符串而不是URL来寻址。不追求addressing uniqueness, 而是probable and eventual addressing uniqueness
- 支持知识的分布式传输(按一定粒度)
- 使用目前主流程序员熟悉的语法形式。
- 尽可能少重新发明轮子——比如rdf:plainLiteral(我是作者之一)这样的字符串类型就没什么必要
- 支持结构化和非结构化数据的混合表达(RDF有Literal,不过,那个太局限了)
- 这个语言的文档不要提什么“语义”(有几个程序员关心SQL的语义?),不要规定什么schema
- 把推理转化为图的操作或者编程语言内置的运算。在这之外的推理都先不考虑。
- 从一开始就设计成在cluster上能运行的语言
- 拜托,用程序员看的懂的语言和例子写文档。
其实这样的语言雏形的一些部分,在不同的技术平台上都已经自发出现了。语义维基,图数据库,新一代检索引擎,都包含了上述部分概念。有心人要做的,就是一个有机的组合。我想,在我写这一段的时候,大概已经有人开始做了。
P.S. 我甚至觉得,都没有必要引入一个新的高级语言语法,就在现有的某种贴近RDF的编程语言里,做少量的增加就能实现目的。最理想的就是Python。为什么这么说?JSON本身就是Python的数据结构。而几乎所有的数据API都吃JSON。Python的类与属性定义与关系就是RDF的翻版。
其实更合适的是Lisp。但是Lisp对抽象思维要求太高,社区又太小。做面向Web的开发,为了工程经济性(人力上的),还是Python比较合适。
P.S. 2 2013-03-04 最近在用PyDatalog和Fuxi,两个Python的推理工具。感觉有了PyDatalog,真的可以用Python直接表达语义数据了,各种传统RDF/OWL/RIF的弱点都被克服了。我fork了一份PyDatalog在Github上 https://github.com/baojie/pydatalog