2013-06-26 2 views
3

SPARQL을 사용하여 관측 순위를 만들고 싶습니다. I가 있다고 가정SPARQL에서 값의 순위를 매기는 방법?

@prefix : <http://example.org#> . 

:A :value 60 . 
:B :value 23 . 
:C :value 89 . 
:D :value 34 . 

순위되어야한다 : C = 1 (가장 높은) : A = 2 : D = 3 : B 최대 = 4. 지금까지 전 사용하여 해결할 수 있었다 다음 쿼리는 : ?x에 대한 URI를 같은 길이있는 경우

prefix : <http://example.org#> 
prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 

SELECT ?x ?v ?ranking { 
?x :value ?v . 
{ SELECT (GROUP_CONCAT(?x;separator="") as ?ordered) { 
    { SELECT ?x { 
     ?x :value ?v . 
     } ORDER BY DESC(?v) 
    } 
    } 
} 
BIND (str(?x) as ?xName) 
BIND (strbefore(?ordered,?xName) as ?before) 
BIND ((strlen(?before)/strlen(?xName)) + 1 as ?ranking) 
} ORDER BY ?ranking 

하지만 쿼리는 작동합니다. 더 나은 해결책은 PHP에서 strpos 또는 Java에서 isIndexOf과 유사한 기능을 갖는 것입니다. 그러나 알고있는 한, SPARQL 1.1에서는 사용할 수 없습니다. 더 간단한 솔루션이 있습니까?

+0

당신이 만들려는 것이 무엇인지에 정교한 수 있습니까? 또는 작성한 쿼리가 생성 한 것을 보여 주시겠습니까? 내부 선택 쿼리는 이미 결과를 주문하므로 이미 주문할 수 있습니다. 바깥 쪽 질의는 문자열 조작을 많이하고, 그들이 무엇을 생산하는지 보여주는 예제가 많은 도움이 될 것입니다. –

+0

오, 당신이 원하는 것을 보았을 것입니다. 예를 들어, 결과를 원하겠습니다. 'C 89 1; A 60 2; D 34 3; B 23 4 '. –

답변

5

이 작업을 수행하는 한 가지 방법은 값의 순위를 값의 개수보다 작거나 같게 만드는 것입니다. 각 값에 대해 다른 모든 값을 검사해야하기 때문에 더 큰 데이터 세트의 경우 비효율적 일 수 있습니다. 그것은 문자열 조작을 요구하지 않습니다.

PREFIX : <http://example.org#> 

SELECT ?x ?v (COUNT(*) as ?ranking) WHERE { 
    ?x :value ?v . 
    [] :value ?u . 
    FILTER(?v <= ?u) 
} 
GROUP BY ?x ?v 
ORDER BY ?ranking 

--------------------- 
| x | v | ranking | 
===================== 
| :C | 89 | 1  | 
| :A | 60 | 2  | 
| :D | 34 | 3  | 
| :B | 23 | 4  | 
--------------------- 
+0

답변 해 주셔서 감사합니다. 내가 제안한 해결책과는 다른 해결책이지만, 대규모 데이터 세트의 경우 매우 효율적인지는 확실하지 않습니다. 나의 예제는 짧았지 만, 실제 응용 프로그램은 약 100 회의 관측이 가능하며 접근 방식을 사용하면 100 개의 서브 쿼리를 의미합니다. 어쨌든 일단 전체 데이터 세트를 준비하면 위에 쓴 것과 당신의 솔루톤을 비교할 것입니다. – Labra

+0

@Labra 방금 샘플 데이터를 더 생성했으며, 1000 개의 요소에 대해 내 대답은 약 4.5 초, 원래 응답에는 약 2.5-2.8이 걸렸습니다. 단지 100 개의 요소 만 있으면 그 차이는 더 작고, 나의 대답은 약 1.8 초, 당신의 답은 1.5입니다. –

+0

@Labra 재사용 성의 측면에서, 샘플 데이터를 처음 생성 한 후에 쿼리가 이상한 결과를 가져 왔음을 지적 하겠습니다. 모든 리소스에 문자열 형식이 같은 URI가 있어야합니다. 그 경우 데이터 생성기를 조정해야했습니다. –

관련 문제