본문 바로가기
Web Development/SPARQL

[SPARQL / RDF] 동일한 URI의 여러 행 데이터를 한 행으로 조회(feat. 카티션 프로덕트/Cartesian Product)

by 감자맹고우 2022. 1. 18.
728x90
반응형

SPARQL 쿼리를 조회하다보면, 쿼리가 길어지기 마련이다.

하나의 속성에 대해서만 조회하면 문제가 없겠지만 실무에서는 여러 개의 속성을 가지고 있는 데이터를 조회하게 된다.

 

예를 들어, 제목과 설명을 모두 갖고 있는 데이터를 조회하는 경우를 말하는 것이다.

이 경우에, RDB에서 두 개의 테이블을 조인해서 조회할 때 발생하는 카티션 프로덕트가 SPARQL에서도 발생한다.

RDB에서는 조인 조건을 추가해줌으로써 카티션 프로덕트가 해소되지만, SPARQL에서는 그런 방법이 없어보였다.

(만약에 있다면, 알려주시면 정말 감사하겠습니다)

 

그렇기에 이 문제를 해결해야했는데, 해결하기 전에 어떤 문제인지 간략히 보도록 하겠다.

 

반응형

 

SPARQL 예제인 사례를 설명하기 위해 DBPedia 한국 Endpoint를 사용하였다.

 

Virtuoso SPARQL Query Editor

 

143.248.135.47

 

해당 Endpoint에서 다음과 같은 쿼리를 날렸다.

 

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT DISTINCT *
WHERE {
    ?s rdfs:label ?o.
    ?o bif:contains "'가나'".
    ?s rdfs:comment ?c.
}

 

URI 중 label 속성(주로 제목/이름)과 comment 속성(주로 설명)이 있는 URI를 조회하되, label 속성에 '가나'라는 글자가 포함된 URI를 중복 없이 조회하겠다는 쿼리이다.

 

s o c
http://ko.dbpedia.org/resource/가나_프리미어리그 "가나 프리미어리그"@ko "가나 프리미어리그(영어: Ghana Premier League)는 가나 축구 리그 시스템 중 최상위 리그이다. 1956년 설립되었다."@ko
http://ko.dbpedia.org/resource/나카니시_가나 "나카니시 가나"@ko "나카니시 카나(中西香菜, 1997년 6월 4일 ~ )는 일본의 여성 아이돌 그룹 스마이레지의 멤버. 연예사무소 업프런트 프로모션 소속."@ko
http://ko.dbpedia.org/resource/나카니시_가나 "나카니시 가나"@ko "나카니시 카나(中西香菜, 1997년 6월 4일 ~ )는 일본의 여성 아이돌 그룹 안주루무(구.스마이레지)의 멤버. 연예사무소 업프런트 프로모션 소속."@ko

 

문제는 다음과 같이 URI(s열)에 동일한 URI가 조회되는 중복이 발생했다는 것이다. 그 이유는 http://ko.dbpedia.org/resource/나카니시_가나 라는 URI에 rdfs:comment 속성값이 2개 이상(c열 참고) 있다는 뜻이다. 그렇기에 동일한 URI라도 여러 행에 걸쳐서 조회된다.

 

만약 이대로 검색결과를 출력했다면, 검색결과에 동일한 URI가 계속 출력되는 현상이 발생할 것이다.

( 구글에서 '가나'를 검색했는데, '나카니시 가나'라는 검색결과로 첫 페이지가 도배된 모습을 상상해보자. 심지어 링크를 클릭했더니 동일한 사이트로 연결된다면? )

 

그렇기에, URI를 하나의 행으로 출력하고, 그 내용은 모두 합칠 수 있는 방법이 필요하다.

 

반응형

 

[ 해결 방법 ]

 

그러기 위해서 사용한 방법은 바로 GROUP_CONCAT을 사용하는 것이었다.

SQL에도 GROUP_CONCAT이 있다. 거의 유사한 기능이라고 생각하면 된다.

사용 방법은 다음과 같다.

 

GROUP_CONCAT( /*조회할 변수*/ ; separator = " /* 구분자 */ ") AS /*별칭으로 사용할 변수명*/

 

쿼리로 표현하면 다음과 같다.

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?s ?o (GROUP_CONCAT(?c; separator = "//////////") AS ?cs)
WHERE {
    ?s rdfs:label ?o.
    ?o bif:contains "'가나'".
    ?s rdfs:comment ?c.
}

 

결과로 다음과 같이 구분자와 함께 URI 단위의 한 행으로 합쳐진 것을 확인할 수 있다.

 

s o cs
http://ko.dbpedia.org/resource/나카니시_가나 "나카니시 가나"@ko 나카니시 카나(中西香菜, 1997년 6월 4일 ~ )는 일본의 여성 아이돌 그룹 스마이레지의 멤버. 연예사무소 업프런트 프로모션 소속.//////////나카니시 카나(中西香菜, 1997년 6월 4일 ~ )는 일본의 여성 아이돌 그룹 안주루무(구.스마이레지)의 멤버. 연예사무소 업프런트 프로모션 소속.

 

🤞 도움이 되셨기를 바랍니다. 한 번의 클릭과 댓글은 어딘가의 누군가에게 진실로 큰 힘이 됩니다. 🐱‍🏍

 

728x90
반응형

댓글