使用基于'三重不存在'的sparql进行选择

时间:2011-08-17 18:00:44

标签: rdf sparql triplestore triples

我需要帮助从我的商店中选择正确的三元组......

<a> a <type/1> .
<b> a <type/1> .
<c> a <type/1> .
<c> a <type/2> .

我想只选择类型为/ 1而不是类型/ 2

的元素

使用sparql select查询实现此目的的最佳方法是什么?

我正在寻找像:

这样的东西
select ?a where 
{ 
    ?a a <type/1> .
    !{ ?a a <type/2> }
}

谢谢,

:)

2 个答案:

答案 0 :(得分:26)

另一种SPARQL 1.1解决方案是使用MINUS例如

SELECT ?a
WHERE
{
  ?a a <type/1> .
  MINUS { ?a a <type/2> . }
}

MINUS从现有匹配项中减去与其三重模式匹配的解决方案。

在大多数情况下,使用FILTER NOT EXISTS { }MINUS { }是等效的,但请注意,有些情况并非如此 - 有关此示例,请参阅SPARQL 1.1 specification

答案 1 :(得分:13)

在SPARQL 1.0中,这有点棘手:

SELECT ?a WHERE {
    ?a a <type/1>.
    OPTIONAL {
        ?a a ?othertype .
        FILTER (?othertype = <type/2>)
    }
    FILTER (!BOUND(?othertype))
}

OPTIONAL子句为?othertype的任何?a绑定<type/2>,并为没有?a的任何FILTER保留未绑定。< / p>

最终?a然后只选择SELECT ?a WHERE { ?a a <type/1>. FILTER NOT EXISTS { ?a a <type/2> . } } 未绑定的行。

在SPARQL 1.1中,它更容易:

{{1}}