1

我试图了解如何在 SPARQL 中使用组合 AND 和 OR 条件进行过滤。

我试图通过维基数据查询服务(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)

可以处理查询,但不会产生任何结果。

三个块中的每一个在{ FILTER . FILTER }没有其他块的情况下都可以正常工作。

我究竟做错了什么?

4

1 回答 1

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

评估为空。

UNION不会将它们“或”在一起-||这样做。

的每个分支UNION都是一个单独的图形模式。

于 2016-03-19T21:06:59.060 回答