2016-03-19 5 views
1

私は、AND条件とOR条件を組み合わせてSPARQLのフィルタリングを行う方法を理解しようとしています。SPARQL - リテラル上のAND&ORフィルタ

私はWikidata Query Service(query.wikidata.org)でニュートンの生存期間内に生きているすべての物理学者を見つけようとします。これは私のクエリです:

SELECT ?p1 ?p1Label ?p1t1 ?p1t2 ?p2 ?p2Label ?p2t1 ?p2t2 
WHERE { 
    FILTER (?p1=wd:Q935) . # Newton 
    ?p1 wdt:P569 ?p1t1 .  # date of birth 
    ?p1 wdt:P570 ?p1t2 .  # date of death 
    ?p2 wdt:P106 wd:Q169470 . # physicist 
    ?p2 wdt:P569 ?p2t1 .  # date of birth 
    ?p2 wdt:P570 ?p2t2 .  # date of death 
    { FILTER (xsd:dateTime(?p2t1) > xsd:dateTime(?p1t1)) 
    . FILTER (xsd:dateTime(?p2t1) < xsd:dateTime(?p1t2)) } 
    UNION 
    { FILTER (xsd:dateTime(?p2t2) > xsd:dateTime(?p1t1)) 
    . FILTER (xsd:dateTime(?p2t2) < xsd:dateTime(?p1t2)) } 
    UNION 
    { FILTER (xsd:dateTime(?p2t1) < xsd:dateTime(?p1t1)) 
    . FILTER (xsd:dateTime(?p2t2) > xsd:dateTime(?p1t2)) } . 
    SERVICE wikibase:label { bd:serviceParam wikibase:language "en" } 
} 
ORDER BY xsd:dateTime(?p2t1) 

クエリは処理できますが、結果は得られません。

3つの{FILTER。 FILTER}ブロックは、他のものがなくても正常に動作します。

私は間違っていますか?

+2

'filter(condition1 || ... || conditionn)'を実行できます。それはあなたが探しているものですか? –

+0

私が|| UNIONの代わりにエラーが出ます。私は異なるブラケットの組み合わせを試みたが、どれも働いていなかった。 –

+0

query.wikidata.orgによって解析される正しいクエリを提供できますか?ありがとう。 –

答えて

3
{ FILTER (xsd:dateTime(?p2t1) > xsd:dateTime(?p1t1)) 
    . FILTER (xsd:dateTime(?p2t1) < xsd:dateTime(?p1t2)) } 

と評価されます。

UNION "または"それらを一緒に使用しない - ||

UNIONの各ブランチは別のグラフパターンです。