Sparql 如何检查三元组是否存在?

Sparql 如何检查三元组是否存在?,sparql,wikidata,Sparql,Wikidata,首先,我打算将像COUNT(?sub)这样的查询表示为?sub_exists,并用COUNT编号检查?sub_exists是否为0。但是,此查询花费的时间太长,因此有时需要超过超时时间。所以我第二次尝试改变函数,如下所示。但是它也需要所有的时间来计算?sub,甚至更糟糕的是,没有为?sub\u存在赋值 是否有另一种方式来表达对的查询,只需检查三元组?sub-wdt:P31/wdt:P279*?s是否存在,并相应地获取它的标志,而无需花费太多时间 SELECT ?s ?sub_exists WHE

首先,我打算将像
COUNT(?sub)这样的查询表示为?sub_exists
,并用COUNT编号检查
?sub_exists
是否为0。但是,此查询花费的时间太长,因此有时需要超过超时时间。所以我第二次尝试改变函数,如下所示。但是它也需要所有的时间来计算
?sub
,甚至更糟糕的是,没有为
?sub\u存在
赋值

是否有另一种方式来表达对的查询,只需检查三元组
?sub-wdt:P31/wdt:P279*?s
是否存在,并相应地获取它的标志,而无需花费太多时间

SELECT ?s ?sub_exists
WHERE {
  VALUES ?s {wd:Q5}
  ?sub wdt:P31/wdt:P279* ?s
  BIND(IF(COUNT(?sub) > 0,1,0) AS ?sub_exists)
}
GROUP BY ?s ?sub_exists 

SPARQL提供了一个很好的替代方案!若模式存在或不存在,ASK将分别返回true或false

以下是一个工作示例:

PREFIX wdt: <http://www.wikidata.org/prop/direct/>

ASK  {
  ?sub wdt:P31/wdt:P279* ?s
}
前缀wdt:
问{
子wdt:P31/wdt:P279*?s
}

Spoiler,答案是正确的。