选择SPARQL查询的否定

时间:2015-05-27 14:19:52

标签: sparql

可以选择sparql查询的“否定”吗?

例如,请考虑以下RDF数据,查询和所需结果:

知识库:

@prefix gr:<http://purl.org/goodrelations/v1#>.
@prefix rdfs:<http://www.w3.org/2000/01/rdf-schema#>.

:prod_A :hasProp :propA.
:prod_B :hasProp :propB.
   :propB rdfs:label "Hello".
:prod_C :hasProp :propC.
:prod_D :hasProp :propD.

虚构查询:

PREFIX gr:<http://purl.org/goodrelations/v1#>

SELECT ?prod WHERE 
   { !( 
      ?prod ?p ?o.
      ?o ?p2 ?o2.
   ) }

理想结果:

| ?prod   |
|---------|
| :prod_A | 
| :prod_C | 
| :prod_D | 

有没有办法解决? (我需要delete

2 个答案:

答案 0 :(得分:3)

我认为MINUS正是您所寻找的:

PREFIX gr:<http://purl.org/goodrelations/v1#>

SELECT ?prod WHERE 
{
  ?prod ?p ?o.
  MINUS { ?o ?p2 ?o2 }
}

它采用左侧匹配的内容(?prod ?p ?o)并删除与MINUS模式匹配的项目对应的任何内容。

请注意,这不会给出您想要的答案,因为?prod ?p ?o模式会匹配您对结果不感兴趣的所有内容,包括链接属性(:propB rdfs:label "Hello"

要获得所需的答案,您需要使查询的第一部分更具体,如下所示:

PREFIX :<http://example.org/>
PREFIX gr:<http://purl.org/goodrelations/v1#>

SELECT ?prod WHERE 
{
  ?prod :hasProp ?o.
  MINUS { ?o ?p2 ?o2 }
}

在这里,我将?p变量更改为:hasProp常量。通过此查询,我得到您想要的答案。

NB - 您没有在示例中定义空前缀,因此我发明了一个使查询有效,因此我可以测试它是否有效

答案 1 :(得分:2)

另一种方法是使用FILTER NOT EXISTS

SELECT ?prod WHERE 
{
  ?prod :hasProp ?o.
  FILTER NOT EXISTS { ?o rdfs:label "Hello". }
}

然后第一个?prod :hasProp ?o.会检查?o是否导致?o rdfs:label "Hello"匹配。使用您最容易理解的表单。