SPARQL 부정 : 모든 FOAF : FOAF가 아닌 요원 : 사람
문제
나는 나에게 모든 것을 줄 SPARQL 쿼리를 작성하려고합니다. foaf:Agents
그렇지 않습니다 foaf:Persons
.
신청 방법을 볼 수 없습니다 이 선택 사항/바운드 구성 이 문제에 대한 모든 속성은 같은 것입니다 rdfs:subClassOf
그리고 rdf:type
전이적이고 반사적입니다.
나는 이것을 시도했다 :
SELECT * WHERE {
?x rdf:type foaf:Agent
OPTIONAL { ?y rdf:type foaf:Person }
FILTER ( !BOUND(?y) ) }
그러나 RDF : 유형은 적어도 Jena/ARQ/SDB와 함께 전이적 인 것 같습니다.
해결책
이것이 작동하지 않는 이유는 두 개의 개별 변수 바인딩이 있기 때문입니다 (?x
그리고 ?y
) 쿼리에서 관련이 없습니다. 그래서 ?x
결과 세트 (원하는 것)에 나타나야하지만 ?y
결함이없고, 당신은 새로운 것을 배우지 못했습니다. ?x
.
업데이트 : 이상적인 쿼리에서는 필요하지 않습니다. ?y
조금도; 들어오는/나가는 에그를 테스트 할 수 있습니다 ?x
곧장. 주어진 변수 바인딩에 모서리가 존재하지 않는지 확인하려면 SPARQL 1.0에서 수행하기가 어렵습니다 (불가능합니까?). 하지만, SPARQL 1.1 부정에 대한 지원을 제공 할 것입니다.
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?agent
WHERE
{
?agent rdf:type foaf:Agent .
FILTER NOT EXISTS { ?agent rdf:type foaf:Person . }
}
@Kingsley Idehen의 접근 방식 (타사 SPARQL 확장 프로그램 사용)은 단기적으로 문제를 해결하는 데 도움이됩니다.
다른 팁
SPARQL 1.0 에서이 작업을 수행하려면 다음을 작성해야합니다.
SELECT * WHERE {
?x rdf:type foaf:Agent
OPTIONAL { ?y rdf:type foaf:Person . FILTER (?x = ?y) . }
FILTER ( !BOUND(?y) )
}
Phil M이 말했듯이, SPARQL 1.1은 새로운 구문을 소개하여 훨씬 더 간단하게 작성합니다.
부정을위한 (초안) SPARQL 1.1 사양은 다음과 같습니다. http://www.w3.org/tr/sparql11-query/#negation
VIRUOSO SPARQL을 통해 검증을위한 엔드 포인트 http://lod.openlinksws.com/sparql (LOD 클라우드 캐시 인스턴스)
SELECT distinct ?x ?o
WHERE {
?x a foaf:Agent .
?x ?p ?o.
filter (!bif:exists ((select (1) where { ?x a foaf:Person } )))
}
limit 10
DESCRIBE ?x
WHERE {
?x a foaf:Agent .
filter (!bif:exists ((select (1) where { ?x a foaf:Person } )))
}
limit 200