2011-05-13 3 views
1

내가 가진 경우 SPARQL 쿼리는 SPARQL에 속성이 몇 번 적용 되었습니까?

PREFIX foaf <http://xmlns.com/foaf/0.1/> 
SELECT ?name 
WHERE { 
    ?x foaf:name ?name. 
    ?x foaf:knows ?y. 
} 

일부 Y를 알고 어떤 X의 이름을 선택 말한다. 정확히 다른 3 명 (또는 다른 번호)을 아는 사람들의 이름 만 어떻게 선택할 수 있습니까?

또한 측면 질문으로 -이 질문에 더 적합한 제목이 있습니까? 문제를 명확히하기 위해 더 나은 용어를 사용하는 사람?

감사

+1

예, 제목이 다소 혼란 스러울 수 있습니다. 그러나 당신이 집계의 존재에 대해 알지 못한다면 그렇게 나쁘지 않다고 생각합니다. 결국 수입품은이 경우에 좋은 질문의 내용입니다. –

+0

@msalvadores 감사합니다. 나는이 용어가 SQL뿐만 아니라 SPARQL에도 적용된다는 것을 몰랐다. – Adam

답변

3

당신은 달성 할 수있는 SPARQL 1.1과 새로운 기능 : GROUP BY, HAVING 및 하위 쿼리. 이 같은 일이 일을 할 것입니다 :

SELECT ?name 
WHERE { 
    ?x foaf:name ?name . 
    { 
     SELECT ?x (count(?y) as ?count_y) WHERE { 
       ?x foaf:knows ?y. 
     } GROUP BY ?x 
     HAVING count(?y) > 3 
    } 
} 

불행히도 모든 SPARQL 엔진은 이러한 모든 기능을 함께 지원하지는 않습니다. 내가 Jena/ARQVirtuoso을 지원한다는 것을 알고 있습니다.

당신은 내가 쿼리를 실행하는 것이 좋습니다 다음이 기능을 지원하지 않는 SPARQL 엔진을 사용하여 작업하는 경우 :

SELECT ?name 
WHERE { 
    ?x foaf:name ?name. 
    ?x foaf:knows ?y. 
} 

을 ... 그리고 프로그래밍 방식으로 당신이 필요한 로직의 나머지를 계산 몇 줄의 클라이언트 측 코드로 쿼리합니다.

+0

그래서 SPARQL 1.1이있다. 이는 엔드 포인트, Jena/ARQ 라이브러리 또는 둘 다에 달려 있습니까? – Adam

+0

또한, 아마 ==,> – Adam

+1

이 아님 @ 정확히 3 명의 친구가 '='(단 하나의 SPARQL이 같음을 나타냄)로 변경됩니다. SPARQL 1.1 지원은 라이브러리가 엔드 포인트로 보내기 전에 구문 분석/유효성 검증 여부에 따라 지원하는 라이브러리가 필요한지 여부에 따라 엔드 포인트에 따라 다릅니다. 라이브러리가이 작업을 수행하지 않으면 엔드 포인트에서 결과를 인코딩하는 데 사용 된 결과 형식이 정확히 같아 보이고 SPARQL 1.1을 인식하지 못하는 라이브러리가 해석 할 수 있으므로 엔드 포인트는 SPARQL 1.1을 지원해야합니다. – RobV