문제

나는 나에게 모든 것을 줄 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 

다음은 SPARQL 1.1에 제공된 다음으로 작동합니다.

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX foaf: <http://xmlns.com/foaf/0.1/> 
SELECT DISTINCT COUNT(?agent)
WHERE 
{
    ?agent rdf:type foaf:Agent .
    FILTER (NOT EXISTS { ?agent rdf:type foaf:Person . })
}

라이브 예제 링크 :

  1. 쿼리 솔루션

  2. 쿼리 정의

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top