我需要帮助从我的商店中选择正确的三元组......
<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> }
}
谢谢,
:)
答案 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}}