2013-09-03 24 views
6

2つのSPARQL xsd:dateTimeの差を計算する関数とは何ですか?SPARQL 2つの日付の差を計算する

私はdatediffへの参照を見つけましたが、これは機能しません。このような組み込み関数は、他のほとんどのクエリ言語と同様にSPARQLに存在しますか?

+0

この質問を匿名ユーザーとして以前に聞いてから削除しましたか?私は今日でもほぼ同じ質問に答えると誓ったことができました。 –

+0

@JoshuaTaylor私は質問をしましたが、それはその一部であり、正確にはこの質問ではありません。 2つの質問は異なり、私はそれを削除しませんでした。 –

+1

xsd:datesの減算に関する質問と、期間を生成するという事実と、代わりに年数を得る方法があるので、ちょっと好奇心旺盛です。だからこそ私はSPARQLコードを準備していました。おそらくちょうど奇妙な偶然の一致、おそらく。 –

答えて

8

一部のSPARQLエンジンは、日付演算を直接サポートします。例えば、this answers.semanticweb.com question and answerのように、Jenaは日付演算をサポートしていて、別の日付から1つの日付を引いてxsd:Durationを得ることができます。他の実装形態は、日付関数をサポートすることができる。例えば、this Virtuoso exampleには、bif:datediffの使用が含まれています。ただし、これらは拡張であり、特定のSPARQL実装での存在が保証されていません。

より移植性の高い、効率的ではありませんが、yearを使用してdatetimeから年の部分を抽出することができます。これはやる、例えば、

select ?age where { 
    bind("1799-12-14"^^<http://www.w3.org/2001/XMLSchema#date> as ?death) 
    bind("1732-02-22"^^<http://www.w3.org/2001/XMLSchema#date> as ?birth) 
    bind(year(?death)-year(?birth) as ?age) 
} 

及び取得結果

------- 
| age | 
======= 
| 67 | 
------- 

これは、2つの日付の月と日によっては、1でオフになる可能性がありますが、同様にすることができますこれを回避するには、monthday関数を使用します。 This threadには、そのような実装のいくつかが記述されています。

+0

リンクが切れています。更新してください。 –

+0

@ KimA.Jakobsen多くのリンクがありますが、最初のものを意味すると思います。 answers.semanticweb.comのサイトは時折少し薄れです。私はそれがあまりにもずっと前にバックアップされることを期待しています。つまり、インターネットアーカイブ/ウェイバックマシンにはhttps://web.archive.org/web/20131026044936/http://answers.semanticweb.com/questions/24017/jena-arq-date-diffにコピーがあります。 –

+0

さて、少し速かったかもしれませんが、私はサイトがすぐにもう一度バックアップを取り戻すでしょう。アーカイブページのおかげで:) –

6

SPARQLで年齢を計算する方法を調べていたときにこの記事を検索しました。正確なヒントを与えてくれたJoshua Taylorに感謝します。しかし、コードセグメントを改善して調整しましたので、死亡した年に誕生日を迎えていない人は1年後に退くことはありません。トピックを検索しているときにこの記事を見つけた人には、役に立つと思っていました。

select ?age where { 
    bind("1799-12-14"^^<http://www.w3.org/2001/XMLSchema#date> as ?death) 
    bind("1732-02-22"^^<http://www.w3.org/2001/XMLSchema#date> as ?birth) 
    bind(year(?death) - year(?birth) - if(month(?death)<month(?birth) || (month(?death)=month(?birth) && day(?death)<day(?birth)),1,0) as ?age) 
} 
+0

信じられないほど便利!更新をありがとう。 –