2017-01-18 15 views
1

私は曜日別にレポートをフィルタリングしようとしているグラフがあります。たとえば、火曜日に発生したすべてのインスタンスを検索したいと考えています。 datetimeフィールドを曜日にフォーマットするか、datetimeフィールドに曜日別にフィルタする方法はありますか?SPARQLで日時の曜日を決定する

答えて

2

背景知識のビットを提供した場合は、標準SPARQLで曜日を決定することもできます。クエリは、この日付に日付と曜日の前に参照日付が必要です。

PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 

SELECT ?date ?dayName 
WHERE { 
    # Sample dates 
    VALUES ?date { 
    "1961-08-04"^^xsd:date 
    "1986-04-03"^^xsd:date 
    } 
    # Compute days since a reference date 
    # This works in Virtuoso, which returns the difference in days. 
    # For example, Fuseki returns xsd:duration instead. 
    BIND (?date - "1900-01-01"^^xsd:date AS ?days) 
    # Compute modulo by 7 without a modulo operator 
    BIND (floor(?days - (7 * floor(?days/7))) AS ?mod) 
    VALUES (?mod ?dayName) { 
     (0 "Monday") # 1900-01-01 was Monday 
     (6 "Tuesday") 
     (5 "Wednesday") 
     (4 "Thursday") 
     (3 "Friday") 
     (2 "Saturday") 
     (1 "Sunday") 
    } 
} 
+0

非常に便利です。標準のSPARQLであるので、これを使用して終了しました:) – OpenDataAlex

+0

これは標準的な構文だけでなく、特定のセマンティクスにも依存しています。クエリのコメントに記載されているように、日付の差はVirtuosoの日数を返しますが、Fusekiでは 'xsd:duration'(および他のRDFストアの実装は異なる場合があります)を返します。これにより、クエリはVirtuoso特有のものになり、同様にRDFストアが動作します。 –

4

SPARQLには今日の名前機能はありませんが、SPARQLエンドポイントがVirtuosoインスタンスであれば、そのSQL関数を活用できます。

SELECT 
            ?birthdate 
    (bif:dayname(?birthdate) AS ?dayname) 
WHERE 
    { <http://dbpedia.org/resource/Barack_Obama> 
     <http://dbpedia.org/ontology/birthDate> ?birthdate 
    } 

- - ここにquery you can run against DBpediaだ私はそれがどのように知らないよりもあなたをブロックして、このような機能のより不足だったと思ってい

birthdate dayname 
1961-08-04 Friday 

からBarack Obama's birthdate and dayを得るであろうあなたのSPARQLを構築するFILTER

(ObDisclaimer:OpenLink SoftwareVirtuosoを生成し、私を採用しています。)SPARQLは「曜日」関数が組み込まれていません

+0

実際、私はVirtuosoを使用しているので、これも非常に便利です!私は長い時間のSQLユーザーの後にSPARQLに深く潜んでいるので、SQL/codeでできることに慣れているので、SPARQLで理解し始めています。 – OpenDataAlex

5

、しかし、ほとんどのプログラミング言語が組み込まれてい曜日を取得するためのサポート指定されたカレンダー/日付オブジェクトから取得します。たとえば、JavaとRDF4Jを使用して、あなたは単に、日付時刻リテラルを(xsd:dateTimeデータ型とLiteralオブジェクトとして表現)を取得できたのJavaカレンダーオブジェクトに変換して、平日を検索:

Literal value = ... ; // the RDF4J literal value from your query result 
Calendar calendar = value.calendarValue().toGregorianCalendar(); 
int weekday = calendar.get(Calendar.DAY_OF_WEEK); 

また、ほとんどのSPARQLエンジンは、カスタム関数を追加するオプションを提供します。

したがって、曜日を取得するためにdateTimeを取得して後処理したり、実際にカスタム関数を作成してSPARQLエンジンに追加することができます。 how to add a custom function to SPARQL using Sesame/RDF4Jに関するチュートリアルです。

+0

ありがとうございましたJeen、それは私が思っていましたが確かめたいのです:) – OpenDataAlex

+0

この "プログラミング言語"オプションはデータベースエンジンの外部でフィルタリングを行い、処理時間と送信データの量を大幅に増やす可能性があります。あなたの直後のケースでは、それは価値のあるトレードオフかもしれませんが、しばしばそうではありません。 – TallTed