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

sig*_*nce 22 rdf sparql triplestore triples

我需要一些帮助从我的商店选择合适的三元组....

<a> a <type/1> .
<b> a <type/1> .
<c> a <type/1> .
<c> a <type/2> .
Run Code Online (Sandbox Code Playgroud)

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

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

我正在寻找像:

select ?a where 
{ 
    ?a a <type/1> .
    !{ ?a a <type/2> }
}
Run Code Online (Sandbox Code Playgroud)

谢谢,

:)

Rob*_*obV 26

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

SELECT ?a
WHERE
{
  ?a a <type/1> .
  MINUS { ?a a <type/2> . }
}
Run Code Online (Sandbox Code Playgroud)

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

在大多数情况下使用FILTER NOT EXISTS { }MINUS { }等效,但要注意有一些不合适的极端情况 - 请参阅SPARQL 1.1规范以获取此示例.


cyg*_*gri 13

在SPARQL 1.0中,这有点棘手:

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

OPTIONAL条款?othertype对任何?a有该条款的条款具有约束力<type/2>,并且对于没有该条款的条款,该条款不受约束?a.

然后决赛FILTER只选择那些?a未绑定的行.

在SPARQL 1.1中,它更容易:

SELECT ?a WHERE {
    ?a a <type/1>.
    FILTER NOT EXISTS { ?a a <type/2> . }
}
Run Code Online (Sandbox Code Playgroud)