H:::SPARQL

H_14. 생물정보LOD SPARQL 튜닝 사례

joyHong 2016. 2. 16. 11:29

2013년과 2014년 국립수목원과 국립중앙과학관에서 국가DB 사업의 일환으로 생물정보LOD가 구축되었다.

생물종 분류군에 대한 정보를 제공하는 LOD 플랫폼과 이를 활용한 LOD생물정보통합시스템을 각각 구축하여

사용자들에게 제공하고 있는 중이다.


생물정보통합시스템에서는 LOD플랫폼에서 제공하는 데이터를 SPARQL을 통해 가져와 페이지를 구성하는 형식인데

초기에 짜여진 SPARQL의 질의 속도가 상당히 느리게 나오는 현상을 발견되었다.

따라서 이를 해결하고자 시스템에서 사용하는 SPARQL을 전달받아 살펴보았다.


SPARQL은 복잡하지는 않은 형태이나 GROUP BY를 사용하여 그룹핑된 결과를 처리하는 형식이라

GROUP_CONCAT을 여러개 사용하고 있었고 OPTIONAL 구문도 여러개 사용하는 형태였다.

또한 GROUP_BY로 묶이는 변수를 보니 전체의 변수가 GROUP_BY로 묶이는 형태였기에

한번 SPARQL을 질의하며 시간이 오래 걸릴 수 밖에 없는 형태였다.


대략적인 형태는 아래와 같다.



SELECT DISTINCT  ?a ?b ?c ~~ 

  (GROUP_CONCAT(DISTINCT ?dd; SEPARATOR=', ') AS ?d) 

  (GROUP_CONCAT(DISTINCT ?ee; SEPARATOR=',') AS ?e) 

  (GROUP_CONCAT(DISTINCT ?ff; SEPARATOR=' ') AS ?f) 

  (GROUP_CONCAT(DISTINCT ?gg; SEPARATOR=' ') AS ?g)

WHERE

  { ?a ~property1 XX .

    ?a rdf:type YY .

    ~~~

    ?a rdfs:label ?label

    FILTER ( lang(?label) = "ko" )

    OPTIONAL

      { ?a ~property2 ?b . }

    OPTIONAL

      { ?a ~property3 ?b . }

    ~~~

    OPTIONAL

      { ?a ~property10 ?b . }

    

    BIND(if(bound(?img), 0, 1) AS ?orderBy)

  }

GROUP BY ?a ?b ?c ~~~ ?orderBy ?k

ORDER BY ?orderBy ?h

OFFSET  0

LIMIT   10





따라서 속도를 개선하기 위해 먼저 반드시 GROUP으로 묶여야 하는 항목을 분리하였다.

왜냐하면 GROUP으로 묶일 필요가 없는 항목은 바인딩된 변수를 통해 GROUP 밖에서 질의를 해도 되기 때문이다.

다음으로는 GROUP으로 묶어야 하는 항목들을 sub query형식으로 별도의 select구문을 생성하였다.

이는 그룹핑으로 오래 걸리는 항목을 추출하는 시간을 최소화하고 필요한 것만 select하여 

상위의 select 구문에서 다른 필요한 항목을 추출하도록 한 것이다.


수정한 SPARQL형태는 대략적으로 아래와 같다.



SELECT DISTINCT  ?a ?b ?c ~~~ ?k

WHERE {

   {

    SELECT ?a ?b 

     (GROUP_CONCAT(DISTINCT ?dd; SEPARATOR=', ') AS ?d) 

     (GROUP_CONCAT(DISTINCT ?ee; SEPARATOR=',') AS ?e) 

     (GROUP_CONCAT(DISTINCT ?ff; SEPARATOR=' ') AS ?f) 

     (GROUP_CONCAT(DISTINCT ?gg; SEPARATOR=' ') AS ?g)

    WHERE

      { ?a rdf:type YY .

        ?a ~propert1 XX .

        ~~~

        ?a rdfs:label ?label

FILTER ( lang(?label) = "ko" )

        OPTIONAL

          { ?a foaf:depiction ?img }

        BIND(if(bound(?img), 0, 1) AS ?orderBy)

        OPTIONAL

          { ?a ~property10 ?b  }

        ~~

      }

    GROUP BY ?a ?b ?orderBy

    ORDER BY ?orderBy ?label

    OFFSET  0

    LIMIT   10

   }

   OPTIONAL

      { ?a ~property3 ?b }

   ~~~

   OPTIONAL

     { ?a ~property10 ?b }

}




SPARQL 구문도 어떻게 구성하느냐에 따라 처리 속도가 많이 차이가 나는 것을 보게 된다.

생물정보LOD에서도 수정 전, 후를 비교해보면 정확히 기억이 나지는 않지만 

1/4 정도 차이가 났었던 것 같다.

LOD데이터를 SPARQL 질의하여 서비스에서 사용하고자 한다면

질의문 생성 방식에 대해서도 고민을 해봐야할 필요가 있을 것이다.