内容


XML 观察

使用 FOAF 支持在线社区

词汇表“朋友的朋友”如何处理可追究性和保密问题

Comments

系列内容:

此内容是该系列 # 部分中的第 # 部分: XML 观察

敬请期待该系列的后续内容。

此内容是该系列的一部分:XML 观察

敬请期待该系列的后续内容。

在结束最近的专栏文章时,我提出了在使用 FOAF 应用程序时出现的一系列问题。 在本专栏中,我对有关可追究性和保密问题给出了一些回答建议。虽然我的建议不一定是唯一的解决方案, 但我强调了通过在线社区测试 FOAF 软件代理而开发和证实的技术。

链接

在我较早的 FOAF 文章中,我略微谈到了当聚集 FOAF 描述时可能发生的事情, 并演示了将社区知识集中在一个地方可以产生的价值。但是,我没有讨论有关如何发现这一信息的主题。

最简单的方法是让参与者通过中央服务注册其 FOAF 文件的 URL,然后中央服务执行聚集。 不幸的是,这有点儿弄巧成拙。Web 基础结构的一个主要优点是其发布分散化的能力。 当您使用中央资源来将 FOAF 文件连接在一起时,您还可以放弃 Web 而只使用单个关系数据库。

与此相反,我采用 Web 的链接模型。FOAF 中使用的特殊机制是 RDF 模式的 seeAlso 特性,它可以提示是否存在相关的机器可读取的信息。 清单 1显示了 FOAF 对我的描述,它包含至我的熟人的链接。

清单 1. 使用 rdfs:seeAlso 来链接 FOAF 描述
<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:foaf="http://xmlns.com/foaf/0.1/">
<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:jdoe@example.org" />
        <rdfs:seeAlso rdf:resource="http://example.org/jdoe/foaf.rdf" />
    </foaf:Person>
  </foaf:knows>
</foaf:Person>
</rdf:RDF>

因而,从 Web 搜索 FOAF 文件的软件代理就可以遵循一个文档到另一个文档的链接,累积有关社区的更多信息。

seeAlso 链接也可作为将 FOAF 描述分成多个文件的有用方法。 清单 2显示了这一方法的示例。

清单 2. 使用 rdfs:seeAlso 协助管理大型的描述
<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:foaf="http://xmlns.com/foaf/0.1/">
<foaf:Person>
  <foaf:name>Edd Dumbill</foaf:name>
  <foaf:mbox rdf:resource="mailto:edd@xml.com" />
  <!-- personal details here -->
  <rdfs:seeAlso rdf:resource="http://example.org/edd/personal.rdf" />
  <!-- photo album metadata here -->
  <rdfs:seeAlso rdf:resource="http://example.org/edd/photos.rdf" />
  <!-- descriptions of friends here -->
  <rdfs:seeAlso rdf:resource="http://example.org/edd/friends.rdf" />
</foaf:Person>
</rdf:RDF>

使用基本的 seeAlso 链接,您确实存在一些风险,即软件代理可能花很长时间搜索它不感兴趣的描述; 例如,旨在发现发布列表的代理对我所拥有的有关假日照片的元数据栈不感兴趣。 幸运的是,您可以使用 RDF 来提供有关已链接资源的更多信息。 清单 3显示了如何表示发布列表。

清单 3. 将更多信息添加到 rdfs:seeAlso 链接
<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:foaf="http://xmlns.com/foaf/0.1/"
        xmlns:bib="http://example.org/biblio/0.1/">
<foaf:Person>
  <foaf:name>Edd Dumbill</foaf:name>
  <foaf:mbox rdf:resource="mailto:edd@xml.com" />
  <!-- publication list -->
  <rdfs:seeAlso>
    <foaf:BiblioRefs rdf:about="http://example.org/edd/biblio.rdf" />
  </rdfs:seeAlso>
</foaf:Person>
</rdf:RDF>

当您使用该机制时,软件代理可以标识他们感兴趣的数据的特定区域。

跟踪谁说了什么

每个现有的社区都基于某种程度的共享信任。如果这种信任消失或被滥用,那么社区会受到损害,并且甚至可能会崩溃。 在线社区说明虽然人们可以随意假想虚构的人物,但还是要稳固地适当保持人与人之间关系的一般规则; 例如,如果您开始发布有害的传闻,那么也会使社区受到损害。

如果 FOAF 要支持在线社区,那么每一段信息的起源必需是可跟踪的。 如果我声明我的名字是“Edd Dumbill”,由此该声明的起源被认为是我,那么它可以证明的事实比其他人所宣称的更可信。 (在其它情况下,您可能不会认为我是有关我本人信息的可信源。 能够跟踪谁说了什么是构建可信系统的必要条件, 但只有这一条件,通常还不够。)

因为示例中的所有 FOAF 文件都是通过 Web 检索的,所以用一个文件的源 URL 来注释在文件中所做的所有声明很有意义。一旦有了 URL, 您就可以用找到的有关它的任何其它有用信息(例如,其作者)来注释 URL。

对于较大范围,起源跟踪的实际实现取决于您用来处理 RDF 的底层工具箱。在我的实验中,我使用了 Redland 工具箱(请参阅 参考资料), 它本身没有起源跟踪能力(尽管它们处于开发阶段)。 我遵循了 developerWorks RDF 专家 Uche Ogbuji 的建议,将起源跟踪作为一个层,放在 Redland 的 RDF 存储之上。(如果您对实现细节不感兴趣,可以跳到 归结于所有权。)

在该机制中,我改写了引入的 RDF 语句来添加其源。 例如,http://example.org/edd/foaf.rdf 上的 FOAF 文件可能生成表 1 中所示的语句。

表 1. 示例语句
主语谓语宾语
_Person1http://xmlns.com/foaf/0.1/mboxmailto:edd@xml.com

如果我使用已创造的特性 http://example.org/prov/pred 和 http://example.org/prov/source 分别表示原始谓语和源 URL,那么我可以改写该语句,如表 2 中所示。

表 2. 使用起源跟踪进行改写的语句
主语谓语宾语
_Person1_DynamicPred1mailto:edd@xml.com
_DynamicPred1http://example.org/prov/predhttp://xmlns.com/foaf/0.1/mbox
_DynamicPred1http://example.org/prov/sourcehttp://example.org/edd/foaf.rdf

您可以使用该机制跟踪每条语句找到源。另注:这主要增加了与聚集所有数据相关的存储量和计算开销: 每条语句都变成三条语句,对谓语的每次查询都必须经过间接层。 由于这个原因,可以优先选用本身支持起源跟踪的工具箱。

归结于所有权

即使使用适当的源跟踪,我仍无法正确地回答“谁讲了什么”这一问题。 因此,我需要将作者与每个文档关联。使用 RDF 和 Dublin Core 词汇表, 我可以通过将 清单 4 中的代码添加到我在 http://example.org/edd/foaf.rdf 上的文件来完成这一任务。注: rdf:about="" 表示 此文档

清单 4. 使用 Dublin Core 表示文档的原创作者
<rdf:Description rdf:about="">
  <dc:creator>
    <foaf:Person>
      <foaf:mbox rdf:resource="mailto:edd@xml.com" />
    </foaf:Person>
  </dc:creator>
</rdf:Description>

使用这个方法的困难之处就是它不作任何保证。因为 RDF 是分散的描述框架, 所以其他人可能对应该是可信的 http://example.org/edd/foaf.rdf 做出一个互相矛盾的原创作者声明。 一个解决方案可能是仅 相信那些包含在正讨论的文档中的那些原创作者声明。 这是有限制的,因为它需要对文档的有关声明是怎么产生的进行改动,这常常是不合需要的,而且如果文档格式不是 RDF,则不可能发生改动。

与此相反,FOAF 工具使用数字签名来使电子邮件地址与文档关联。 将 OpenPGP 与新的名称空间 http://xmlns.com/wot/0.1/ 一起使用明确地表示 信任 Web(Web of trust)这一概念。 清单 5 显示了如何使数字签名与文档关联。尤其是,它在第一个描述中说明了签名与文档本身的关联, 然后作为 seeAlso 链接的一部分,为该链接文档指定签名。 这样,就可以在相关文档的内部或外部表示原创作者信息。

清单 5:将数字签名与 FOAF 文档关联
<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:foaf="http://xmlns.com/foaf/0.1/"
    xmlns:wot="http://xmlns.com/wot/0.1/">
<rdf:Description rdf:about="">
    <wot:assurance rdf:resource="foaf.rdf.asc" />
</rdf:Description>
<foaf:Person>
  <foaf:name>Edd Dumbill</foaf:name>
  <foaf:mbox rdf:resource="mailto:edd@xml.com" />
  <!-- personal, PGP signed, details here -->
  <rdfs:seeAlso>
    <rdf:Description rdf:about="http://example.org/edd/personal.rdf">
       <wot:assurance rdf:resource="http://example.org/edd/personal.rdf.asc" />
    </rdf:Description>
  </rdfs:seeAlso>
</rdf:Person>
</rdf:RDF>

数字签名的实际意义应该被理解为:“声称有某某电子邮件地址的人证明了他有这个文件, 并且此后此文件未被更改过。”在我的实验中,我假设证明携带签名者的语义,以此认可所包含的 FOAF 文件中的语句。 如果 foaf.rdf.asc 中的签名(如 清单 5 中引用的那样)检验通过, 那么处理工具可以隐式地添加 清单 4中所包含的类似描述。

关于数字签名是否真正属于某个特定的人的问题很方便地转交给 PGP 本身用于建立信任的机制。 讨论 PGP 的信任 Web 超出了本文的范围,但您可以在 参考资料中查找某些参考资料。

起源跟踪的使用

现在,让我们看一下所讨论的机制的使用。研究 FOAF 时,我构建了软件代理 FOAFBot,它聚集并回答有关 FOAF 信息的查询。现在,可以公开获得该代码(请参阅 参考资料)。

清单 6显示了包括起源跟踪的样本会话。

清单 6:示例 FOAFBot 会话
<edd> edd@xml.com's name
<foafbot> edd@xml.com's name is 'Edd Dumbill', according to Dave Beckett,
Edd Dumbill, Jo Walsh, Kip Hampton, Matt Biddulph, Dan Brickley; and
anonymous sources Anon47
<edd> edd's email
<foafbot> edd's email is '[mailto:edd@usefulinc.com]', according to Dave
Beckett, Edd Dumbill, Kip Hampton, Matt Biddulph; and anonymous sources
Anon14, Anon2, Anon43, Anon47, Anon92, Anon93
<foafbot> edd's email is '[mailto:edd@xml.com]', according to Edd Dumbill;
and anonymous sources Anon21
<foafbot> edd's email is '[mailto:edd@xmlhack.com]', according to Edd
Dumbill, Jo Walsh, Dan Brickley

在第一个查询中,您可以看到声明我的名字是“Edd Dumbill”的所有人的列表。您还可以看到有一个源没有以数字方式对其信息进行签名,所以表示为 Anon47 。第二个查询显示了多条关于我的电子邮件地址以及谁产生了它们的声明。

因此,要信任谁的问题留给用户自己判断。其它地方存在大量关于使信任等级自动化的研究:FOAFBot 没有试图解决这个问题。

将 FOAF 限制在信任社区

Web 是一个非常公用的地方,出于许多好的动机,您不想让每个人都可以使用信息。 例如,我很高兴能让我的朋友知道我的手机号码,但不希望电话销售员知道。 许多有主页的人都是通过将密码告诉其朋友来解决这一问题的。 然而,在许多情况下,人们选择根本不发布信息。Google 和其它 Web Spider 程序在查找您忘记是公共可访问的信息方面 令人难以置信地有效。

对于 FOAF,也应用同样的原理。虽然我很高兴每个人的 FOAF Spider 程序都能获取我的名字和主页(很公开的信息),但我愿意将某些信息限制于特定社区。可以通过扩展 OpenPGP 和 seeAlso 链接的使用来完成。

有了 OpenPGP,我可以通过使用公钥加密内容。只能由代理用相应的私钥解密该内容。 作为示例,我为正在 OpenProjects IRC 网络 #foaf 讨论通道上运行的 FOAFBot 创建了公钥, 并决定只有该通道的成员才能使用某些信息。我将该信息放在 foaf-private.rdf 文件中, 签名并将它加密成相应的公钥(生成 foaf-private.rdf.asc 文件), 然后我的 FOAF 文件链接到该文件,如 清单 7 中所示。 然后,仅发布 ASCII 编码的加密文件,至专用数据的未加密源保留在我的专用机器上。

清单 7:显示加密 FOAF 文件链接的代码片段
  <!-- private info for authorized agents only -->
  <rdfs:seeAlso>
      <foaf:Document rdf:about="http://example.org/edd/foaf-private.rdf.asc">
        <!-- encrypted for the #foaf community -->
        <wot:encryptedTo>
          <wot:PubKey wot:hex_id="6C7F734E" />
        </wot:encryptedTo>
      </foaf:Document>
  </rdfs:seeAlso>

清单 7 中除了使用了 seeAlso , 还使用信任 Web 名称空间上的更多概念来表示使用的公钥。 搜索代理得到没有为它们加密某些 FOAF 文件的通知,于是代理可以忽略那些文件。

隐藏电子邮件地址

当您发布任何含有您电子邮件地址的信息时,一个主要问题是多余的商业电子邮件或垃圾邮件。 虽然可以使用日益有效的方法来检测和丢弃垃圾邮件,但许多人还是通过不在 Web 上发布其电子邮件地址来试图避免接收垃圾邮件。

这似乎对 FOAF 词汇表提出了难题。如果您回想起有关该主题的上一篇文章,假定电子邮件地址是一个明确特性 ― 用于合并来自不同源的描述。没有它,FOAF 聚集就不能工作。幸运的是,FOAF 的创建者提出了一个替代项 mbox_sha1sum 特性。该特性包含邮箱 URI 的 ASCII 编码的 SHA1 散列; 该编码是单向映射并且不能很一般地进行逆向工程以给出原始的电子邮件地址。 清单 8 显示了如何在 FOAF 文件中使用它来代替 mbox 特性。

清单 8:使用 mbox_sha1sum 防止获得电子邮件地址
<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_sha1sum>fd991c34194a4428e70cdcc8068deaa6f35464fe</foaf:mbox_sha1sum>
</foaf:Person>
</rdf:RDF>

为了合并 FOAF 描述以继续工作,处理代理必须转而根据 mbox_sha1sum 特性合并, 并当它们仅知道 mbox 特性的情况时动态地计算 FOAF 描述的总和。 在您对其他人的描述中,引用他们的 mbox_sha1sum 特性而不是他们的电子邮件地址,对于您来说或许是有礼貌的。 如果其中一个人想使她的电子邮件地址变得可用,她可以在她自己的 FOAF 文件中引用它,或许还可以象上面描述的那样对它进行加密。

结束语

FOAF 词汇表提供了一种管理社区内信息的有用方法。关于其他人的信息常常是最令人感兴趣的一类数据,而且 FOAF 实现了分散、机器可读和个人描述等需求。 但在其自己的应用领域之外,FOAF 提供了用于研究有关构建语义 Web 的概念(链接、信任和起源的概念)的有用试验台。


相关主题


评论

添加或订阅评论,请先登录注册

static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=10
Zone=XML
ArticleID=21698
ArticleTitle=XML 观察: 使用 FOAF 支持在线社区
publish-date=08012002