2017-12-04 15 views
0

との明確な名...たとえば :SPARQL:、私は自分の誕生日に俳優を取得したいと思いDBpediaの、 のSPARQLで要求を持つ異なるデータ型

select ?actor ?name ?birthDate where { 
    ?actor <http://purl.org/linguistics/gold/hypernym> dbr:Actor ;  
    rdfs:label ?name ; dbo:birthDate ?birthDate . 
    filter(?name = "Tom Cruise"@en) 
} LIMIT 5 

私はこの結果を得ます: enter image description here

私の関心はbirthDateのデータ型についてですが、私は鈍感なDISTINCT型を宣言し、その前の要求に一つだけの結果を持っている方法を探しています。

アイデア?

+2

これはできません。リテラルの字句を 'STR(?birthDate)'と使っても、 "1962-07-04"と "1962-7-3"の文字列が違うことになります。それはDBpedia respのデータ品質の問題です。ウィキペディアデータの正規化/クレンジングは、残念なことにクライアントコードであなた次第です。 – AKSW

+0

唯一の方法は、dbpediaクエリに基づいて独自のクリーンアップデータセットを作成することです。 –

+0

あなたはこれらの列のうちどれを気にしますか? 'SAMPLE'は行く方法かもしれません... – TallTed

答えて

0

まず、私はDBpediaのを確認するために、生年月日のためだけxsd:dateデータ型を使用することを考えて、このクエリを試してみることができます。

select distinct datatype(?birthDate) where { 
    ?actor <http://purl.org/linguistics/gold/hypernym> dbr:Actor ;  
    dbo:birthDate ?birthDate . 
} 

問題がで述べたような値のいくつかは、汚れているということですコメント、彼らは浄化する必要があります。それにはいくつかの回避策がありますが、それがうまくいくかどうかはわかりません。

最初に、同じ意図された日付のすべての形式が統一されていることを保証する必要があります。DISTINCTをフィルタに使用できます。

の値を取る必要がありますが、xsd:dateTimeは実際には許容範囲を示していますが、なんらかの理由でyyyy-m-d ....の値を受け取ります。その結果、?birthDatexsd:dateTimeに変換し、xsd:dateに変換します。たとえば、try select xsd:date (xsd:dateTime ("2000-1-1")) {}の場合、結果は"2000-01-01"^^xsd:dateとなります。どういうわけか、それだけで動作します。

次に、一部のデータが汚れているため、オプションはありませんが、これらのデータを削除するには、2000-0-0などの値を除外する必要があります。これを行うには、?birthDateの値を必要な形式に転送する必要があります。 ?birthDateをキャストできない場合は'!'を返しますので、この目的のために(coalesce(xsd:dateTime(xsd:date(?birthDate)), '!'))を実行します。

私は動作するクエリを持っていませんが、原則的には助けてください。

+0

これは** yyyy-md ....という形式の値を受け入れません - 不正確で不正な構文です。データの品質の問題ですリテラルの検証構文なしでこれらのトリプルをロードできるトリプルストアもあります。 – AKSW

関連する問題