2


0

SPARQL xsd:dateTimeの等価性

私はSPARQLクエリを持っています:

PREFIX  rdfs:
PREFIX  person:
PREFIX  likedEvent:
PREFIX  event:
PREFIX  owl:
PREFIX  xsd:
PREFIX  rdf:
PREFIX  weather:
PREFIX  eventHasSuitableWeather:
PREFIX  freeAtEvent:

SELECT DISTINCT  ?Event ?Person ?Time
WHERE
  { ?Person   rdf:type              person:Person .
    ?Event    rdf:type              event:Event .
    ?WeatherEvent
              rdf:type              weather:WeatherEvent .
    ?WeatherType  rdf:type          weather:WeatherEventType .
    ?Person   likedEvent:likedEvents  ?Event ;
              freeAtEvent:freeAtEvent  ?Event .
    ?Event    eventHasSuitableWeather:eventHasSuitableWeather  true ;
              event:eventHasDate    ?Time .
    ?Person   person:hasName        ?PersonName ;
              person:hasAge         ?PersonAge .
    ?Event    event:hasEventType    ?EventType .
  }

特定のオントロジーで次の結果セットを返します:

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Event                                                                   | Person                                            | Time                                                                |
=====================================================================================================================================================================================================
|  |   | "2010-01-19T16:00:00Z"^^ |
|           |   | "2010-01-19T16:00:00Z"^^ |
|           |  | "2010-01-19T16:00:00Z"^^ |
|  |  | "2010-01-19T16:00:00Z"^^ |
|          |   | "2010-01-19T17:00:00Z"^^ |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

時間制約を追加して、その時点で発生するイベントを選択します。

2010-01-19T16:00:00Z

そこで、現在のクエリにFILTER要素を追加します。

PREFIX  rdfs:
PREFIX  person:
PREFIX  likedEvent:
PREFIX  event:
PREFIX  owl:
PREFIX  xsd:
PREFIX  rdf:
PREFIX  weather:
PREFIX  eventHasSuitableWeather:
PREFIX  freeAtEvent:

SELECT DISTINCT  ?Event ?Person ?Time
WHERE
  { ?Person   rdf:type              person:Person .
    ?Event    rdf:type              event:Event .
    ?WeatherEvent
              rdf:type              weather:WeatherEvent .
    ?WeatherType  rdf:type          weather:WeatherEventType .
    ?Person   likedEvent:likedEvents  ?Event ;
              freeAtEvent:freeAtEvent  ?Event .
    ?Event    eventHasSuitableWeather:eventHasSuitableWeather  true ;
              event:eventHasDate    ?Time .
    ?Person   person:hasName        ?PersonName ;
              person:hasAge         ?PersonAge .
    ?Event    event:hasEventType    ?EventType .
    FILTER ( ?Time = "2010-01-19T16:00:00Z"^^xsd:dateTime )
  }

ただし、今回のクエリは同じオントロジーで空の結果リストを返します。

-------------------------
| Event | Person | Time |
=========================
-------------------------

明らかに、SPARQLまたはxsd:dateTimeの比較について何かが欠けていますが、それを理解できませんでした。 アイデアをお持ちの場合は、ご案内ください。 ありがとう。

更新

私はJena Frameworkで使用されているSPARQLのARQ実装を使用しています。問題はオントロジーやクエリではなく実装に関するものだと思います

com.hp.hpl.jena.datatypes.xsd.XSDDateTimeおよびcom.hp.hpl.jena.datatypes.xsd.AbstractDateTimeの実装を調べました:http://grepcode.com/file/repo1.maven .org / maven2 / com.hp.hpl.jena / jena / 2.6.0 / com / hp / hpl / jena / datatypes / xsd

dateTimeオブジェクトは9つの値で表されることがわかりました。

protected final static int CY = 0, M = 1, D = 2, h = 3, m = 4, s = 5, ms = 6, utc=7, msscale=8

XSDDateTimeオブジェクトがjava.util.Calendarオブジェクトから作成され、オントロジーから解析されたXSDDateTimeオブジェクトが常にゼロの場合、値msscaleは常に3です。 さらに、比較関数はこれらの9つの値がすべて等しいかどうかをチェックするため、値が等しくなることはありません。 たとえば、クエリテキストを編集してFILTERを追加すると、等価性チェック後に目的の結果が得られます。 しかし、FILTERをプログラムで追加すると、2つのFILTERのシリアル化は同じになりますが、結果は同じではありません。 次に、2つのクエリとその直後に表示される結果の例を示します。

PREFIX  rdfs:
PREFIX  person:
PREFIX  likedEvent:
PREFIX  event:
PREFIX  owl:
PREFIX  xsd:
PREFIX  rdf:
PREFIX  weather:
PREFIX  eventHasSuitableWeather:
PREFIX  freeAtEvent:

SELECT DISTINCT  ?Event ?Person ?Time
WHERE
  { ?Person   rdf:type              person:Person .
    ?Event    rdf:type              event:Event .
    ?WeatherEvent
              rdf:type              weather:WeatherEvent .
    ?WeatherType  rdf:type          weather:WeatherEventType .
    ?Person   likedEvent:likedEvents  ?Event ;
              freeAtEvent:freeAtEvent  ?Event .
    ?Event    eventHasSuitableWeather:eventHasSuitableWeather  true ;
              event:eventHasDate    ?Time .
    ?Person   person:hasName        ?PersonName ;
              person:hasAge         ?PersonAge .
    ?Event    event:hasEventType    ?EventType .
    FILTER ( ?Time = "2010-01-19T16:00:00Z"^^xsd:dateTime )
  }

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
| Event                                                                   | Person                                            | Time                                                                |
=====================================================================================================================================================================================================
|           |  | "2010-01-19T16:00:00Z"^^ |
|           |   | "2010-01-19T16:00:00Z"^^ |
|  |  | "2010-01-19T16:00:00Z"^^ |
|  |   | "2010-01-19T16:00:00Z"^^ |
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

PREFIX  rdfs:
PREFIX  person:
PREFIX  likedEvent:
PREFIX  event:
PREFIX  owl:
PREFIX  xsd:
PREFIX  rdf:
PREFIX  weather:
PREFIX  eventHasSuitableWeather:
PREFIX  freeAtEvent:

SELECT DISTINCT  ?Event ?Person ?Time
WHERE
  { ?Person   rdf:type              person:Person .
    ?Event    rdf:type              event:Event .
    ?WeatherEvent
              rdf:type              weather:WeatherEvent .
    ?WeatherType  rdf:type          weather:WeatherEventType .
    ?Person   likedEvent:likedEvents  ?Event ;
              freeAtEvent:freeAtEvent  ?Event .
    ?Event    eventHasSuitableWeather:eventHasSuitableWeather  true ;
              event:eventHasDate    ?Time .
    ?Person   person:hasName        ?PersonName ;
              person:hasAge         ?PersonAge .
    ?Event    event:hasEventType    ?EventType .
    FILTER ( ?Time = "2010-01-19T16:00:00Z"^^xsd:dateTime )
    FILTER ( ?Time = "2010-01-19T16:00:00Z"^^xsd:dateTime )
  }

-------------------------
| Event | Person | Time |
=========================
-------------------------

更新

jena-devで同じ質問をしたところ、クエリやコードに問題はないことがわかりました。 これはJena 2.6.0の問題ですが、Jena 2.6.2ですでに修正されています。

1 Answer


1


クエリに明らかに問題はありません。これは、使用しているSPARQLエンジンが=演算子を実装する方法に問題がある可能性があります。 どのSPARQLエンジンを使用していますか?

=演算子は値が等しいことを確認する必要があります。そのため、クエリがオントロジーに対して評価されたときに、フィルターが期待どおりの結果を返します。

使用しているSPARQLエンジンで=演算子がRDF用語の等価性のみを実行している場合でも、リテラルは依然として完全に一致するため、結果が得られるはずです。

使用しているSPARQLエンジンと実際のオントロジーのコピーを投稿すると、「動作するはずです」よりも良い答えが得られる可能性があります

更新

私は疑いますが、これがxsd:dateTimeのシリアライゼーション/デシリアライゼーションの奇妙な問題かもしれないと断言することはできません。 Jena開発者のメーリングリストに問題の詳細を記載したメールを送信し、開発者とコミュニティがこの問題について回答できるかどうかを確認します。