지식그래프(Knowledge Graph)

[SPARQL] URI를 '/'로 구분하고 마지막 문자열만 추출

송채채 2023. 8. 11. 11:53

type이 여러개인 개체를 출력할 때, 한 행으로 합쳤더니 prefix없이 URI가 모두 들어가서 읽기 어려운 상태가 되었다.

원래 계획은 prefix를 붙여서 출력하고 싶었지만, 그러려면 prefix를 모두 알고 있는 상태에서 변환하는 작업이기때문에 포기하고 다른 방법을 찾았다.

 

http://www.w3.org/2000/01/rdf-schema#Class 이러한 URI가 있을 때, 마지막 '/'를 기준으로 가장 뒤에 있는 문자열만 출력하게 하고 싶어서 찾아본 결과 정규식을 사용한 예시를 참고하였다.

 

-  BIND (REPLACE(STR(?type), "^.*/([^/]*)$", "$1") as ?typeName)

PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>

SELECT ?URI (GROUP_CONCAT(DISTINCT ?typeName; separator = ", ") AS ?types) ?label ?definition 
WHERE { 
    ?URI a ?type ;
        rdfs:label ?label ;
        skos:definition ?definition .
    BIND (REPLACE(STR(?type), "^.*/([^/]*)$", "$1") as ?typeName)
}
GROUP BY ?URI ?label ?definition
1
"rdf-schema#Class, owl#Class"
"address"@en
"index to a location to which communications may be delivered"
2
"rdf-schema#Class, owl#Class"
"addressing scheme"
"system for allocating addresses to objects"

 

^.*/([^/]*)$

  1. ^: 이 기호는 문자열의 시작을 나타냅니다. 이 패턴은 문자열의 시작부터 매칭함
  2. .*: .은 어떤 문자 한 개를 나타내며, *는 그 앞에 있는 문자가 0번 이상 반복되는 것을 나타냅니다. 따라서 .*는 모든 문자(0번 이상 반복)를 의미합니다. 여기서는 문자열의 시작부터 어떤 문자열이든 매칭함
  3. /: 슬래시 문자(/)를 나타냅니다. 이것은 직접적으로 문자열에 있는 슬래시와 매칭시킴
  4. ([^/]*): 괄호로 둘러싸인 부분은 그룹으로 캡처. [^/]는 슬래시 문자를 제외한 어떤 문자 한 개를 나타내며, *는 그 앞에 있는 문자가 0번 이상 반복되는 것을 나타냅니다. 따라서 ([^/]*)는 슬래시를 제외한 어떤 문자열(0번 이상 반복)을 캡처하는 그룹을 나타냄
  5. $: 이 기호는 문자열의 끝을 나타냅니다. 
  6. 결론적으로, 문자열 끝부분에서 슬래시(`/)로 시작하는 모든 문자열을 의미함

참고

Stack overflow, SPARQL - Extract Last part of a URI

 

 

반응형