可以选择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
)
答案 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"
匹配。使用您最容易理解的表单。