语义化网络
缘起
这几天在研读ActivityPub的标准。标准一开头便提到他们使用JSON-LD格式来交换数据。 搜了搜JSON-LD,发现是基于JSON的RDF语法。RDF是我几年前学的,已经有些遗忘,于是今天又复习了一下,在此略做记录。
更详细的可以参考SimmerChen写的知乎专栏。
语义化网络
我们都知道我们现在用的是互联网。我们可以在网络上看到很多“链接”。通过一个个链接,我们可以访问一个个网页。这很好,至少对人类而言。 但是对机器而言可能就没那么好了。比如说我们塞给机器一个小说,希望它能找出文章的标题和简介,或者文章中谁爱上了谁。能做到吗? 也许现在通过AI分析可以,但是很麻烦,比较难办到。
那怎么办呢?答案很简单,我们改造这篇小说,把小说格式化即可。例如我们可以用一个简单的格式:
{
"title" : "This is the title",
"description" : "This is the description",
"couple" : [["a", "b"], ["c", "d"]]
}
这样看上去似乎对机器更友好。我们可以直接解析JSON来访问title
这个键来获得标题,访问description
这个键来获得描述,
访问couple
这个键来获得文章中互为夫妻关系的关系列表。
基于类似的想法,我们便有了语义网。RDF(Resource Definition Framework)通过主语、谓词、宾语标准化了这一描述过程。例如对于上述例子, 我们可以转化为:
- 文章 标题 “This is the title”
- 文章 简介 “THis is the description”
- “a” 夫妻关系 “b”
- “c” 夫妻关系 “d”
同时这里的主语、宾语可以用URI表示,可能是网络上的任何一个数据。于是我们便从文章的网络变成了数据的网络。具体RDF的语法有很多种, 例如Turtle、JSON-LD、N-Triples等。
对于谓语,如果我们随便写,不是不行,但是很容易产生歧义,因此我们需要事先定义一些词汇,之后再用词汇表中的词汇来进行描述。
Foaf就是这样一个词汇表,当然它主要描述人和社交网络。查看它的网页,可以发现有着许多严格的定义,
例如说一个项目(foaf:Project)不能是文档(foaf:Document)或人(foaf:Person)。当我们看到前缀foaf
时,我们就明白,我们正在使用这个词汇表,
理解文档时就要参考这里的定义。其他的词汇表还有RDFS和OWL。
查询方面有查询语言SPARQL。数据库有DBPedia,是从维基百科抽出数据后语义化的百科数据库。
ActivityStream
回到ActivityHub,我们可以看到在数据开头有一个"@context": "https://www.w3.org/ns/activitystreams"
的键值对。这便是告诉我们
它正在使用ActivityStreams的词汇了。如果我们访问这个网址,我们便会发现一系列定义好的词汇,定义之细致可以说完全可以照着写出数据结构了。
在定义中主要分两部分,一部分是类别,另一部分是属性。类别很简单,有对象、活动、链接等,活动则有创建、添加、点赞等,这里就不赘述。 属性的文档中有几个字段顺便解释下,“Domain"对应适用这一属性的主体,“Range"对应属性适用的值,“Functional"表示这个值是否唯一。
我们还可以看到在定义中还有MUST、SHOULD、MAY等词汇,这些是定义于RFC2119中 用于表示要求级别的关键词。MUST表示必须做,SHOULD表示无特殊情况下应当做,MAY则表示可做可不做。
总结
读读标准还挺有趣。