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

SPARQL-如果属性存在,如何过滤,否则按原样添加?,sparql,wikidata,Sparql,Wikidata,我试着选择那些出生日期(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 {?p

我试着选择那些出生日期(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 }

}
可能可以使用->可选(过滤器(绑定)(如果(绑定())))。。但我想不出来

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

可选
参数的任务是“初始化”一个变量,即绑定一个变量

过滤器(!BOUND(?date)| year(?date)>1920)
的意思是-将所有匹配项添加到结果中,其中
?date
变量未“初始化”或如果它已“初始化”-将
year(?date)>1920
过滤器计算结果为true的所有匹配项添加到结果中

当我在上面的时候:

VALUES?职业{wd:Q82955 wd:Q212238 wd:Q193391 wd:Q116}
是javascript的等价语,表示变量x=(a | | | b | | | c | | d)。 如果这些属性中的任何一个匹配,则
?职业索引也将绑定。
将属性分组到
值中
可以提高查询效率,减少超时的机会

由于任何实际原因,
减号
过滤器不存在
,可以认为是相同的。(它们不在边缘案例中) 如果手边的匹配项(在执行的那个点)包含列出的属性“wd:P570,wd:P58,…”中的任何一个,它们都会显示出来。但与
不同,评估上下文是
|
或,而不是任何值

我使用了
MINU
FILTER NOT EXISTS
,因为只使用其中一个会导致查询超时


(它可能会变得更有效,因为“wdt:102”生成的匹配项最多,留下的块太大,下面的操作符无法进行排序)

SELECT?political?date WHERE{VALUES?occulations{wd:Q193391 wd:Q116}?political wdt:P106?occulations.可选的{political wdt:P569?date.}过滤器(!bound)(?date)| year(?date)>1920)}
谢谢!你救了我一周!两种情况下“!bound(?date)”的计算结果是什么?我想在两种情况中的一种情况下它的计算结果是false。在这种情况下-FILTER(false)的计算结果是什么?FILTER(false)与“?
!bound(?date)相同
涵盖了没有日期的情况,因为由于
可选
这可能是未绑定的,即变量
?date
没有绑定。关于
过滤器(false)
,不确定您的意思,但这只会导致没有绑定。您还可以将过滤器重写为例如
过滤器(不存在){?political wdt:P569?date.}{political wdt:P569?date.FILTER(year(?date)>1920)}存在
,如果您不需要日期,则省略可选的。事实上更详细,效率更低,因此我同意我的第一个建议。因此,正确的说法是:当执行查询时,
OPTIONAL
参数的工作是“初始化”也称为绑定变量。
FILTER(!BOUND(?date)| year(?date)>1920)
表示-将所有匹配项添加到结果中,其中
?date
变量未“初始化”,或者如果它已“初始化”,则将所有匹配项添加到结果中,其中
year(?date)>1920)}
FILTER的计算结果为true。(您选择在评论中发布答案是否有原因?)