4

xml でシリアル化された RDF を (関連する場合に備えて XMP メディア記述の一部として) 受け取り、Ruby で処理しています。私はrdfgemを使用しようとしていますが、他のソリューションを見てうれしく思います。

最も基本的なデータを読み込んでクエリすることはできましたが、シーケンスとバッグを含むアイテムのクエリを作成しようとすると行き詰まります。

XML RDF の例:

<rdf:RDF xmlns:rdf='http://www.w3.org/1999/02/22-rdf-syntax-ns#'>
 <rdf:Description rdf:about='' xmlns:dc='http://purl.org/dc/elements/1.1/'>
  <dc:date>
   <rdf:Seq>
    <rdf:li>2013-04-08</rdf:li>
   </rdf:Seq>
  </dc:date>
 </rdf:Description>
</rdf:RDF>

クエリをまとめる私の最善の試み:

require 'rdf'
require 'rdf/rdfxml'
require 'rdf/vocab/dc11'

graph = RDF::Graph.load( 'test.rdf' )

date_query = RDF::Query.new( :subject => { RDF::DC11.date => :date } )

results = date_query.execute(graph)

results.map { |result| { result.subject.to_s => result.date.inspect  } }

 => [{"test.rdf"=>"#<RDF::Node:0x3fc186b3eef8(_:g70100421177080)>"}]

この段階での結果 (「クエリ ソリューション」?) は、rdf:Seqコンテナーへの参照であるという印象を受けます。しかし、私はどのように進歩するかについて迷っています。上記の例では、最終的には array になると思い["2013-04-08"]ます。

rdf:Seqとコンテナーのない受信データがある場合、 http://rdf.rubyforge.org/RDF/Query.htmlの例に従って、rdf:li使用したい文字列を抽出できます- 残念ながら、より複雑なクエリの例は見つかりませんまたはRubyで処理されたRDF構造。RDF::Query

編集:さらに、オブジェクトで使用する適切なメソッドを見つけようとすると、RDF::Nodeそれが持つ可能性のあるさらなる関係を調査する方法がわかりません:

results[0].date.methods - Object.methods
 => [:original, :original=, :id, :id=, :node?, :anonymous?, :unlabeled?, :labeled?, :to_sym, :resource?, :constant?, :variable?, :between?, :graph?, :literal?, :statement?, :iri?, :uri?, :valid?, :invalid?, :validate!, :validate, :to_rdf, :inspect!, :type_error, :to_ntriples]
# None of the above leads AFAICS to more data in the graph

xpath で同じデータを取得する方法は知っていますが (少なくとも、シリアル化で常に同じパスを取得する場合)、この場合に使用するのに最適なクエリ言語ではないと感じています (ただし、これは私のバックアップ計画です。 RDF クエリ ソリューションを実装するには複雑すぎることがわかります)。

4

1 に答える 1