SPARQL - 如何过滤属性是否存在,否则按原样添加?



我正在尝试选择出生日期(wdt:P569(高于1920年的人,如果他们有出生日期并添加其他没有出生日期的人。

SELECT ?politician
WHERE {
VALUES ?occupations {wd:Q193391 wd:Q116}
?politician wdt:P106  ?occupations .
OPTIONAL {
?politician wdt:P569 ?date .
FILTER (year(?date) > 1920)
}
MINUS {?politician wdt:P102 ?o }
FILTER NOT EXISTS {?politician wdt:P570|wdt:P509|wdt:P20 ?o }
}

它可能可以使用 -> OPTIONAL(FILTER(BIND(IF(BOUND((((((( 来解决。但是我想不通。

SELECT ?politician
WHERE {
VALUES ?occupations {wd:Q82955 wd:Q212238 wd:Q193391 wd:Q116}
?politician wdt:P106  ?occupations .
OPTIONAL {?politician wdt:P569 ?date .}
FILTER (!bound(?date) || year(?date) > 1920) 
MINUS {?politician wdt:P102 ?o }
FILTER NOT EXISTS {?politician wdt:P570|wdt:P509|wdt:P20 ?o }
}

谢谢AKSW!

OPTIONAL参数的工作是"初始化"A.K.A。BIND变量。

FILTER( !BOUND(?date) || year(?date)>1920 )

说 - 将所有匹配项添加到结果中,其中变量未"初始化"?date或者如果它已"初始化" - 添加所有匹配项year(?date) > 1920其中过滤器计算结果为 true。

当我在上面时:

VALUES ?occupations {wd:Q82955 wd:Q212238 wd:Q193391 wd:Q116}相当于javascript说var x = (a || b || c || d)。 更像这样 如果这些属性中的任何一个匹配,则?occupatoins也会绑定。 将属性分组到VALUES可使查询更高效,并且超时的可能性更小。

出于任何实际原因,MINUSFILTER NOT EXISTS都可以被认为是相同的。(它们不在边缘情况下( 如果手头的匹配项(在执行时(包含任何列出的属性"wd:P570, wd:P58, ..",它们都会看起来。但与VALUES不同的是,评估上下文是|OR,而不是 ANY。

我同时使用了MINUFILTER NOT EXISTS,因为仅使用其中一个会使查询超时。

(它可能变得更有效率,因为"WDT:102"产生最多的匹配项,留下的块太大,让以下运算符无法排序(

最新更新