使用spira / RDF.rb序列化模型和解析引用

时间:2013-11-25 18:02:24

标签: ruby rdf activemodel

我正在使用Spira作为Ruby应用程序的模型/持久层。我无法为我的个人模型获得合适的序列化(例如,作为RDF / XML)。例如,当我转储包含“关联”的模型时,我得到的XML看起来像:

<ns0:video rdf:about="info:whatever/videos/g91832990">
  <ns1:contributor rdf:resource="info:whatever/interviewees/g88129610"/>
  <ns1:title>Test Video</ns1:title>
  <ns0:files rdf:resource="info:whatever/files/g91776800"/>
</ns0:video>

但是,我想要这个XML表示来解析rdf:resource引用。也就是说,我希望XML看起来更像这样(这是我在转储整个存储库/ triplestore时得到的结果):

<ns0:video rdf:about="info:repository/videos/g91832990">
  <ns1:contributor>
    <ns2:person rdf:about="info:repository/interviewees/g88129610">
      <ns2:name>Creator</ns2:name>
    </ns2:person>
  </ns1:contributor>
  <ns1:title>Test Video</ns1:title> <!-- ... -->
</ns0:video>

扩展了贡献者元素以包含相关元数据。我可以使用SPARQL查询获得第一级引用,如:

sparql.construct([:o, :p2, :o2]).where([node, :p, :o], [:o, :p2, :o2])

其中node是我的“about”节点。但是,我想要任意深度。我知道这个问题可能涉及更大的问题,比如在SPARQL / RDF中进行递归查询。但是,我希望在Spira或RDF.rb中会有一些切换或设置只会改变输出格式。

对我的术语表示不满:我确信“解析引用”不是正确的术语。

修改

在Spira中,模型mixin RDF::Enumerable;他们有一个RDF表示,包含来自triplestore的RDF语句,其中subject是模型的URI。 “倾倒模型”看起来像:

v = Video.find 'RDF::Enumerable'
v.dump(:rdfxml)

生成的RDF / XML仅包含模型的RDF语句。也可以使用以下命令转储整个triplestore(例如,上面的第二个示例):

Spira.repository.dump(:rdfxml)

1 个答案:

答案 0 :(得分:1)

这个答案有两个部分。首先,RDF / XML序列化中使用的XML的特定结构无关紧要(就RDF数据而言;您仍然可以自由地偏好它的外观)。第二部分是关于从RDF.rb中获取你想要的东西(出于审美原因)。

RDF / XML的特定XML结构无关紧要

RDF是基于图形的数据表示。 RDF中的基本信息是三元组,也称为语句,其格式为

  

主题谓词对象

其中一大堆构成了RDF图。这些RDF图可以以多种格式序列化。有些很容易手工阅读和写,有些则更复杂。一些序列化格式可能只有一种编写给定RDF图的方法,或者定义规范方式,但是大多数将为您提供许多不同的方法来编写相同的RDF图。

例如,以下数据(在Turtle中):

@prefix : <http://example.org/> .

<info:repository/videos/g91832990>
  a :video ;
  :contributor <info:repository/interviewees/g88129610> ;
  :title "Test Video" .

<info:repository/interviewees/g88129610>
  a :person ;
  :name "Creator" .

可以用不同的方式在RDF / XML中序列化,因为格式允许使用大量的简写符号。例如,对于Jena,如果我序列化为(普通)RDF / XML,我得到:

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns="http://example.org/" > 
  <rdf:Description rdf:about="info:repository/videos/g91832990">
    <rdf:type rdf:resource="http://example.org/video"/>
    <contributor rdf:resource="info:repository/interviewees/g88129610"/>
    <title>Test Video</title>
  </rdf:Description>
  <rdf:Description rdf:about="info:repository/interviewees/g88129610">
    <rdf:type rdf:resource="http://example.org/person"/>
    <name>Creator</name>
  </rdf:Description>
</rdf:RDF>

但如果我序列化为RDF / XML-ABBREV,我得到:

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns="http://example.org/">
  <video rdf:about="info:repository/videos/g91832990">
    <contributor>
      <person rdf:about="info:repository/interviewees/g88129610">
        <name>Creator</name>
      </person>
    </contributor>
    <title>Test Video</title>
  </video>
</rdf:RDF>

那些相同的 RDF图。后者写入可能要贵一些,因为它使用更多的缩写,但它们是相同的 RDF图。

  

但是,我想要这个XML表示来解析rdf:resource   引用。也就是说,我希望XML看起来更像这样(这是   当我进行整个存储库/三元组的转储时我得到的结果:

<ns0:video rdf:about="info:repository/videos/g91832990">
  <ns1:contributor>
    <ns2:person rdf:about="info:repository/interviewees/g88129610">
      <ns2:name>Creator</ns2:name>
    </ns2:person>
  </ns1:contributor>
  <ns1:title>Test Video</ns1:title> <!-- ... -->
</ns0:video>

只要你认识到以一种格式倾斜模型而不是另一种形式的模型不会改变你得到的图形,那么拥有审美偏好是可以的。序列化的结构不会影响SPARQL查询的结果,因为SPARQL查询基于RDF图,而不是序列化。事实上,尝试使用XML工具和RDF / XML序列化来访问RDF确实是一个坏主意,正如我在this answerHow to access OWL documents using XPath in Java?中所讨论的那样。

使用RDF.rb

获取缩写的RDF / XML

根据其网站,RDF.rb支持number of serialization formats(强调添加):

  • RDF :: NTriples
  • RDF :: JSON(插件)
  • RDF :: N3(插件)
  • RDF :: Raptor :: RDFXML(插件)
  • RDF :: Raptor :: Turtle(插件)
  • RDF :: RDFa(插件)
  • RDF :: RDFXML(插件)
  • RDF :: Trix(插件)

请注意,RDFXML有两个,一个通过Raptor,另一个来自RDF.rb.其中至少有一个应该为更简洁的RDF / XML提供支持。我最近没有使用过RDF.rb,但我似乎记得Raptor库提供了许多选项,所以这可能是一个不错的选择。当然,内置的可能也有一些东西。

如果你开始在rdf-rdfxml的源代码中挖掘,你可以在writer中找到一个可以帮助你的初始化选项:

# @option options [Integer]  :max_depth (3)
#   Maximum depth for recursively defining resources