打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
XML 观察: 使用 XML 和 RDF 找到朋友

2002 年 6 月 01 日

Edd Dumbill 研究称为朋友的朋友(Friend-of-a-Friend (FOAF))的 XML 和 RDF 应用程序。FOAF 允许表示个人信息和各种关系,它是一种创建支持在线社区的信息系统的有用构件。代码样本演示了其基础知识。

不是您知道什么,而是您知道谁。自从 Web 出现以来,Web 上对自我的表述就同其它内容一样多。许多人初涉 Web 世界就是从给自己构建主页开始的。搜索引擎意味着您可以非常快地找到具有相同兴趣的人。的确,这项技术非常有趣,但是人本身却总是更有趣。

个人 Web 发布趋势中最新插曲之一是 Web 日志(weblog),它是一种快速发布的格式,具有个人的、非正式的特性。Web 日志用户喜欢相互引用,从而喜欢创建多个网站之间的对话。支持这种快速发布形式的技术之一是 Rich Site Summary 或 RSS(参阅 参考资料),它是一种包含有关站点上内容项的元数据的 XML 文档。

RSS 创建了一种可预见的方法用于对内容片段进行聚集、排序和搜索。类似 Syndic8 和 Meerkat 的站点(参阅 参考资料)使您能够跟踪您感兴趣的主题 ― 或人 ― 而发表观点的人。RSS 还非常简单,您经常可以发现 XML 教程材料的示例中使用了它。其部分吸引力在于那种让您能够将您的内容连接至更大的 Web 的方法,这使得其他人能够更容易地找到您。

然而,本文并不是关于 RSS 的 ― 它在别处已有详细的记载。我将研究一个有些类似的称为朋友的朋友(FOAF)的新项目。该项目进一步深化 Web 的社会网络方面。

无处不在的社区

在因特网上,社区的数量正在不断激增,包括各种社区,从专业机构到社会团体。Dan Brickley 和 Libby Miller 发明的 FOAF 词汇表为社区成员提供了一种基本表达:描述人及其基本特性,如姓名、电子邮件地址等等。

FOAF 只是一个 RDF 词汇表。它的常规用法类似于 RSS:在 Web 服务器上创建一个或多个 FOAF 文件并共享 URL,这样,使得软件可以使用该文件内的信息。和创建您自己的 Web 页面一样,分散创建 FOAF 数据并使其创建在您的控制之下。使用这些文件的示例应用程序可能是一个社区目录,成员在该目录内维护他们自己的记录。然而,如同 RSS 一样,当聚集数据然后探究和交叉链接这些数据时,FOAF 才显露出其真正有趣的部分。

FOAF 有望成为一种管理社区的重要工具。除提供简单的目录服务之外,您还可以以许多方式使用 FOAF 上的信息。例如:

  • 通过对来自可信的同事的邮件区分优先级来增加对电子邮件的过滤
  • 为社区新成员提供帮助
  • 查找兴趣相投的人

 

本文余下部分描述了 FOAF 的基本特性,并为当前实现和未来考虑事项提供了一些启示。让我们从 FOAF 解决的核心问题开始:为了描述人要如何标识人。





回页首


表达身份

开始将有关现实世界事物(如人)的数据输入计算机系统时,您会碰到为每样事物创建一个唯一的名称这一难题。以人为例,很显然,某人的姓名不足以向计算机唯一地标识他。在大多数封闭的系统中,往往为人们分配特定于应用程序的标识符。可以在 Web 上看到这一点:您可能将用户名/密码对用于如邮件列表和网站之类的多种不同的服务。只要您根本不希望这些分隔开的、封闭的系统相互操作,您就不会有问题(也许,除了需要记忆大量的标识符之外)。

如果希望在多项服务上统一您的身份,那么情况就变得比较复杂。有人不得不提出一个集中式的方案来控制身份分配。最近我们看到发展很快的一种这样的方案是 Microsoft 的 Passport。然而,由于种种原因这种集中非常危险,不仅是因为会使第三方完全控制您对服务的访问,并且可能控制您的私人数据。

因此,如果您考虑 FOAF 系统 — 在该系统中,任何人都可以自由创建及使用数据,而希望每人只有一个名称 — 那么就需要一个分散命名策略。Web 有一种构建良好的命名策略,它与此类似:URI。对于人的命名,您可能认为 mailto: (电子邮件地址)将是一种可供使用的方便的 URI 方案。然而,事实不象看起来的那样简单。天真的方法可能让开发人员写下一些荒唐的话,例如:

mailto:edd@xml.com lives in the UK

稍做思考会发现这句话实际上毫无意义,因为您可以真实地写下:

mailto:edd@xml.com is an e-mail address

很显然,某人和他的电子邮件地址不是一回事,因此,您实际上不能将某人的电子邮件地址作为全局名。而且,某人可能有多个电子邮件地址,每个地址用于一个不同的目的。

然而,使用电子邮件地址来标识某人的原理并没有缺陷:通常,如果您向一个地址发送一条电子邮件消息,那么您希望它能到达某个确定的人。那种天真的方法没有考虑到的是:虽然您永远也不能为某人创建全局名,但您可以合理地假设包含“这个人的电子邮件地址是 edd@xml.com”的所有个人描述非常可能指同一个人。

因此,您可以正确地写下:

                        The person with e-mail address mailto:edd@xml.com lives in the UK.                        

这就是 FOAF 的工作方式。为了组合关于特定个人的信息,我们假定电子邮件地址是一种 确定的属性― 即只有一人拥有某个特定的邮箱。





回页首


FOAF 的基本特性

撇开理论,让我们看一看 FOAF 信息采用何种格式。因为代码常常比文字更能说明问题,清单 1 显示了一小段对我自己的 FOAF 描述。


清单 1. 有关作者的样本 FOAF 描述
                        <rdf:RDF                         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"                         xmlns:foaf="http://xmlns.com/foaf/0.1/">                        <foaf:Person>                         <foaf:name>Edd Dumbill</foaf:name>                         <foaf:mbox rdf:resource="mailto:edd@xml.com" />                        </foaf:Person>                        </rdf:RDF>

简单地说, 清单 1中的描述表明“有一个名叫 Edd Dumbill 的人,他的电子邮件地址为 edd@xml.com。”

FOAF 使用 RDF 来对其描述进行编码。在本文中,我将坚持使用 RDF 十分基本的用法,即通过列出带类型的对象(在 清单 1 的例子中,类型是 foaf:Person )及其特性(在 清单 1 中,是 foaf:namefoaf:mbox )来模仿面向对象的数据结构。关于 RDF 的更多信息,请参阅 参考资料

表 1 显示了其它一些更简单特性,这些特性使我能够表示关于我自己的更多信息。

表 1. 对单个人进行特征描述的一些更简单特性

特性
nick 一个字符串文字,它给出一个名称,用于在聊天或其它计算机系统上标识用户;例如 AIM 屏幕名称或 UNIX 登录
homepage 某人主页的 URL
workplacehomepage 某人工作地主页的 URL
depiction 描述某人的图片的 URL
phone 某人的电话号码

在清单 2 中,我用这些特性中的几个来增加对我的描述。(我省去了外层 RDF 封套以节省版面。)


清单 2. RDF 摘录,其中将来自表 1 的更多特性添加到对作者的描述中
                        <foaf:Person>                         <foaf:name>Edd Dumbill</foaf:name>                         <foaf:mbox rdf:resource="mailto:edd@xml.com" />                         <foaf:nick>edd</foaf:nick>                         <foaf:workplacehomepage rdf:resource="http://xml.com/" />                         <foaf:depiction                         rdf:resource="http://heddley.com/edd/images/edd-shoulders.jpg" />                        </foaf:Person>                        

至此,示例向我们提供了一种创建计算机可读的主页的有用方法。如果在线社区上的每个人都提交指向一个 FOAF 文件的 URL,那么您就可以将他们编织成一个合理的社区目录。





回页首


知己知彼

我还没有研究的一个特性是 foaf:knows 特性。可以用它来将两个人链接在一起,它具有某种相熟的人的基本语义。使用该特性时,首先碰到的就是必须标识别人。如同我在 表示身份中所总结的,FOAF 通过描述其他人的特性来标识他们:从这里开始,处理器就可以使用标识特性来推断提到的是哪个人。清单 3 显示了我怎样表示我认识 Simon St.Laurent。


清单 3. foaf:knows 特性示例,它建立两个熟人之间的联系
                        <foaf:Person>                         <foaf:name>Edd Dumbill</foaf:name>                         <foaf:mbox rdf:resource="mailto:edd@xml.com" />                         ...                         <foaf:knows>                         <foaf:Person>                         <foaf:mbox rdf:resource="mailto:simon@xmlhack.com" />                         <foaf:name>Simon St.Laurent</foaf:name>                         </foaf:Person>                         </foaf:knows>                        </foaf:Person>                        

清单 3对我的描述中,我添加了“此人认识拥有邮箱 simon@xmlhack.com 并且姓名为 Simon St.Laurent 的人。”我用粗体突出显示了邮箱行,因为 FOAF 将使用邮箱来实际生成到 Simon 的链接,而不是使用任何其它属性。

如同我将在下一节中演示的那样,如果程序读取我的 FOAF 文件,同时也读取 Simon 的文件,那么我可能理所当然地想要请求它“显示我认识的人的姓名和主页。”即使我没有透露关于 Simon 主页的任何信息,但如果 Simon 提供了该信息,那么程序可以通过共享的 foaf:mbox 属性这个优点将事实链接在一起。





回页首


合并 FOAF 描述

当 FOAF 文件合并在一起时,使用 FOAF 词汇表的真正强大功能才体现出来。注:词汇表完全没有限制您创建对您自己的唯一描述。例如,我可以为其他几个人创建 FOAF 描述。让我们来尝试一个小示例。首先,清单 4 显示了我创建的一个文件。


清单 4. 对作者和两个同事的简单描述
                        <rdf:RDF                         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"                         xmlns:foaf="http://xmlns.com/foaf/0.1/">                        <foaf:Person>                         <foaf:name>Edd Dumbill</foaf:name>                         <foaf:mbox rdf:resource="mailto:edd@xml.com" />                        </foaf:Person>                        <foaf:Person>                         <foaf:name>Simon St.Laurent</foaf:name>                         <foaf:mbox rdf:resource="mailto:simon@xmlhack.com" />                        </foaf:Person>                        <foaf:Person>                         <foaf:name>Eric van der Vlist</foaf:name>                         <foaf:mbox rdf:resource="mailto:eric@xmlhack.com" />                        </foaf:Person>                        </rdf:RDF>                        

假定 Eric 有一本在线相簿。他可以用它来创建清单 5 中所显示的 FOAF 文件。


清单 5. 对两人的描绘的说明
                        <rdf:RDF                         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"                         xmlns:foaf="http://xmlns.com/foaf/0.1/">                        <foaf:Person>                         <foaf:mbox rdf:resource="mailto:edd@xml.com" />                         <foaf:depiction rdf:resource="http://example.org/photos/edd+simon.jpg" />                        </foaf:Person>                        <foaf:Person>                         <foaf:mbox rdf:resource="mailto:simon@xmlhack.com" />                         <foaf:depiction rdf:resource="http://example.org/photos/edd+simon.jpg" />                        </foaf:Person>                        </rdf:RDF>                        

一眼就可以清晰地看出,放在一起的这两个文件的整个导入就是:除我已表述的信息之外,从 http://example.org/photos/edd+simon.jpg 获得的特殊照片上描述了 Simon St.Laurent 和 Edd Dumbill。

为了让计算机理解这一点,必须让计算机执行这两个数据文件的合并 — 即,计算机必须处理文件中的数据以强制执行规则“如果某人 A 与某人 B 具有相同的 foaf:mbox 属性,那么 A 和 B 是相同的实体。”进行了这个处理之后,系统所知道的可以如清单 6 中的那样进行表示。


清单 6. 从合并清单 4 和清单 5 中的属性所得的描述
                        <rdf:RDF                         xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"                         xmlns:foaf="http://xmlns.com/foaf/0.1/">                        <foaf:Person>                         <foaf:name>Edd Dumbill</foaf:name>                         <foaf:mbox rdf:resource="mailto:edd@xml.com" />                         <foaf:depiction rdf:resource="http://example.org/photos/edd+simon.jpg" />                        </foaf:Person>                        <foaf:Person>                         <foaf:name>Simon St.Laurent</foaf:name>                         <foaf:mbox rdf:resource="mailto:simon@xmlhack.com" />                         <foaf:depiction rdf:resource="http://example.org/photos/edd+simon.jpg" />                        </foaf:Person>                        <foaf:Person>                         <foaf:name>Eric van der Vlist</foaf:name>                         <foaf:mbox rdf:resource="mailto:eric@xmlhack.com" />                        </foaf:Person>                        </rdf:RDF>                        

至此,我希望您可以看到合并所提供的能力。通过聚集和合并 FOAF 文件,您可以获得同操作集中式目录服务相同的效果,而没有单点故障或单点控制的任何问题。对于许多需要分散或转移控制的社区来说,这是一项极富吸引力的特性(要么因为政治结构的缘故要么纯粹是因为大小的缘故)。





回页首


有趣的演示

由于篇幅的原因,我在这里不能解释有关 FOAF 词汇更多内容。进一步探讨它的方法是看一看一些演示。

  • 共同描绘: 清单 5说的是,在一张照片中描绘了两个人。您可以从清单 5 的数据中获取有用和有趣的效果。在共同描绘演示(参阅 参考资料)中,您可以得到一组二人相映托的照片,这组照片是通过二人相距六种不同的距离得到的。
  • 在线聊天:作为我对 FOAF 研究的一部分,我创建了一个软件代理程序(bot),它位于聊天论坛内,并且由于它已经编织了他们的 FOAF 文件网络,因此可以提供关于社区成员的信息。其代码还没有发布,但下面有一个样本会话:
                                <edd> oracle, edd‘s name                            <oracle> edd‘s name is ‘Edd Dumbill‘                            <edd> oracle, Edd Dumbill‘s nick                            <oracle> Edd Dumbill‘s nick is ‘edd-lap‘                            <oracle> Edd Dumbill‘s nick is ‘edd‘                            <edd> oracle, picture of Dave Beckett and Uche Ogbuji                            <oracle> Picture at http://photos.example.com/pic_029.jpg                            <oracle> Caption: Greg Fitzpatrick, Dave Beckett, Libby Miller,                            Uche Ogbuji

同样,请务必查阅 参考资料以获取更多 FOAF 文档和演示。





回页首


更深入的问题

朋友的朋友系统提出了许多问题,其中许多问题本质上是社会和法律问题。在这里限于篇幅无法深入讨论它们,但您可能会思考其中的一些问题。

  • 怎样才能控制数据使之位于可信的社区内?
  • 为了纠正错误并提供可说明性,怎样才能跟踪和保证事实的出处?
  • 怎样才能分割数据以便对某些信息保密(例如,“某人 X 不信任某人 Y”)而将其它信息公之于众?
  • FOAF 信息聚合者在其操作权限以内必须承担数据保护法律下的什么法律义务呢?
  • 如何将 FOAF 加入到诸如邮件列表、IRC/chat、web 日志、RSS 和 wikis 之类的其它已建立的及新兴的社区工具呢?

FOAF 开发人员目前都在考虑这些问题以及其它问题。可以通过订阅 rdfweb-dev 邮件列表来参与 FOAF 讨论(参阅 参考资料)。





回页首


参考资料

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
用 SPARQL 搜索 RDF 数据2
Xerdoc Together 浅述RDF,畅想一下FOAF应用
HTML 的未来: XHTML 2.0
Python Web 服务开发人员: 用于 Python 的 RSS
Py之rdflib:rdflib库的简介、安装、使用方法之详细攻略
探析数字音乐个性化推荐系统
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服