5

アイテムのリビジョンを追跡するために使用される RDF ファイルがあります。このデータを使用して、アイテムに加えられた変更をそのライフタイムを通じてトレースバックできます。特定が変更されると、対応するデータが新しいリビジョンとして配置されます。見てください..

@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix mymeta: <http://www.mymeta.com/meta/> .
@prefix dc: <http://purl.org/dc/elements/1.1/> .

<urn:ITEMID:12345> rdf:type mymeta:item .
<urn:ITEMID:12345> mymeta:itemchange <urn:ITEMID:12345:REV-1> .
<urn:ITEMID:12345:REV-1> dc:title "Product original name"@en .
<urn:ITEMID:12345:REV-1> dc:issued "2006-12-01"@en .
<urn:ITEMID:12345:REV-1> dc:format "4 x 6 x 1 in"@en .
<urn:ITEMID:12345:REV-1> dc:extent "200"@en .

<urn:ITEMID:12345> rdf:type mymeta:item .
<urn:ITEMID:12345> mymeta:itemchange <urn:ITEMID:12345:REV-2> .
<urn:ITEMID:12345:REV-2> dc:title "Improved Product Name"@en .
<urn:ITEMID:12345:REV-2> dc:issued "2007-06-01"@en .

このデータによると、「2007-06-01」にアイテム名のみ「改良品名」に変更されたアイテム改訂がありました。ご覧のとおり、最新のデータ リビジョンには「dc:format」と「dc:extent」がありません。これは、何百万もの重複レコードを回避するための意図的なものです!

最新の製品リビジョン情報 (REV-2: dc:title および dc:issued) を表示する SPARQL クエリを作成できますが、最後から引き継がれる "dc:format" と "dc:extent" が欠落しています。リビジョン (REV-1)。

これを行うために SPARQL クエリを作成するにはどうすればよいですか? どんな助けでも大歓迎です!

4

3 に答える 3

2

単一のアイテムの場合、これは SPARQL 1.1 のサブクエリを使用した非常に簡単なクエリです。秘訣は、特定のプロパティを持つリビジョンを日付順に並べ、最新のリビジョンから値を取得することです。フォームは、values選択しているアイテムを指定するためにのみ使用されます。さらに項目を照会する必要がある場合は、それらをvaluesブロックに追加できます。

prefix mymeta: <http://www.mymeta.com/meta/> 
prefix dc: <http://purl.org/dc/elements/1.1/> 

select ?item ?title ?format ?extent where {
  values ?item { <urn:ITEMID:12345> }

  #-- Get the title by examining all the revisions that specify a title, 
  #-- ordering them by date, and taking the latest one.  The same approach
  #-- is used for the format and extent.
  { select ?title { ?item mymeta:itemchange [ dc:title ?title ; dc:issued ?date ] . }
    order by desc(?date) limit 1 }

  { select ?format { ?item mymeta:itemchange [ dc:format ?format ; dc:issued ?date ] . }
    order by desc(?date) limit 1 }

  { select ?extent { ?item mymeta:itemchange [ dc:extent ?extent ; dc:issued ?date ] . }
    order by desc(?date) limit 1 }
}
$ sparql --data data.n3  --query query.rq
----------------------------------------------------------------------------------
| item               | title                      | format            | extent   |
==================================================================================
| <urn:ITEMID:12345> | "Improved Product Name"@en | "4 x 6 x 1 in"@en | "200"@en |
----------------------------------------------------------------------------------

実際にすべてのアイテムに対してこれを行う必要がある場合は、別のサブクエリを使用してアイテムを選択できます。つまり、 の代わりにvalues ?item { ... }、次を使用します。

{ select ?item { ?item a mymeta:item } }

元の質問では言及されていませんでしたが、コメントに出てきました。すべてのプロパティの最新のプロパティ値を取得することに興味がある場合は、How to に基づいて次のようにサブクエリを実行できます。 SPARQL ソリューション グループのサイズを制限しますか?

select ?item ?property ?value {
  values ?item { <urn:ITEMID:12345> }

  ?item mymeta:itemchange [ ?property ?value ; dc:issued ?date ]

  #-- This subquery finds the earliest date for each property in
  #-- the graph for each item.  Then, outside the subquery, we 
  #-- retrieve the particular value associated with that date.  
  {
    select ?property (max(?date_) as ?date) {
      ?item mymeta:itemchange [ ?property [] ; dc:issued ?date_ ]
    }
    group by ?item ?property
  }
}
---------------------------------------------------------------
| item               | property  | value                      |
===============================================================
| <urn:ITEMID:12345> | dc:issued | "2007-06-01"@en            |
| <urn:ITEMID:12345> | dc:title  | "Improved Product Name"@en |
| <urn:ITEMID:12345> | dc:extent | "200"@en                   |
| <urn:ITEMID:12345> | dc:format | "4 x 6 x 1 in"@en          |
---------------------------------------------------------------
于 2013-10-14T18:01:14.327 に答える
2

1 つのクエリでこれを実行できるかどうかはわかりません。できればもっと考えてみますが、次の 2 つのクエリで正しい方向に進むことができます。

1) フォーマットを持たない変更を見つける

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX mymeta: <http://www.mymeta.com/meta/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>

DESCRIBE ?change
WHERE 
{
    ?item a mymeta:item;
             mymeta:itemchange ?change.
    ?change ?p ?o.
    OPTIONAL 
    {
        ?change dc:format ?format .
    }
    FILTER (!bound(?format)) 
}

2)これは、フォーマットを持つ最も古い変更を見つけると思います

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX mymeta: <http://www.mymeta.com/meta/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>

SELECT DISTINCT ?format
WHERE {
    ?item a mymeta:item;
             mymeta:itemchange ?change.
    ?change  dc:format ?format;
                  dc:issued ?issued.
    OPTIONAL {
        ?moreRecentItem a mymeta:item;
                ?moreRecentItem dc:issued ?moreRecentIssued.
        FILTER (?moreRecentIssued > ?issued)}
    FILTER (?bound (?moreRecentIssued))
}

もう少し作業を進めれば、(2) の ?format を、(1) の結果の発行データより前の発行日を持つ変更からのものに制限できるはずです。したがって、(1) の行ごとに (2) を実行して、使用するフォーマット値を見つけます。ただし、SPARQL ではなくルールベースの推論エンジンを使用した場合は、より良い結果が得られる可能性があります。EulerSharp または Pellet をお勧めします。

于 2010-03-09T22:30:44.147 に答える
-1

私はこれを RDF Quads を使用して実装し、各リビジョンを個別の名前付きグラフ内に保存し、よく知られている名前付きグラフを使用して、すべてのリビジョンと共に各項目の最新のリビジョンを追跡しました。

最新のリビジョンを識別する方法がなく、トリプルが最後に発生した時間を見つけるためにリビジョンを簡単に追跡できないため、パッチアルゴリズムの理論には現在欠陥があります。さらに、最新のリビジョンでトリプルが見つからない場合、常に以前のリビジョンに戻ってトリプルを取得しようとすると、リビジョンでトリプルが合法的に削除されたかどうかをどのように知ることができますか?

RDF データベースは、リテラルと URI を 1 回だけ格納し、ポインターを使用してトリプルまたはクワッドを構成することにより、重複の量を制限できる必要があります。保持しているリビジョンごとにすべてが保存されている単純なケースで機能させることができる場合があります。

于 2013-07-09T03:50:12.177 に答える