SPARQL CONSTRUCT 빈 노드 검수SPARQL CONSTRUCT 중복 노드SPARQL 템플릿 blank node

SPARQL CONSTRUCT 빈 노드 검수, 주문 하나에 상세가 두 개 생기는 이유

SPARQL CONSTRUCT 템플릿의 빈 노드 라벨은 해마다 새 노드를 만듭니다. 주문 상세 수, DISTINCT, IRI 재사용과 미바인딩을 가상 표본 7개로 검수합니다.

이 글을 쓴 알파카랩스카카오·네이버·쿠팡 출신, 재하청 0%, 대기업·공공기관 등 18개사+ 레퍼런스

발행 ·알파카랩스

템플릿에 적은 같은 빈 노드 라벨은 해마다 새 노드를 만듭니다. 아래 예시에서는 주문 하나에 해가 둘이면 상세도 둘입니다.

2026년 11월 14일 기준입니다. 주문은 한 건인데 내보낸 RDF에 상세가 두 개 생기는 경우가 있습니다. 주문에 분류 태그가 두 개 붙으면 질의의 중간 결과가 두 행이 되고, 각 행으로 같은 템플릿을 평가하면서 상세가 하나씩 만들어집니다. 여기서 해는 쿼리 패턴에 맞는 변수 값의 조합입니다.

태그 하나가 늘면 왜 상세 노드도 늘까?#

아래 가상 질의에서 태그는 상세에 쓰이지 않지만 해를 늘립니다. 주문에 품목이 하나, 태그가 두 개라면 주문과 품목이 같아도 두 해가 생깁니다. 한 해에서 같은 빈 노드 라벨을 두 번 쓰면 두 트리플은 같은 상세를 가리킵니다. 다음 해에서는 새 상세가 만들어집니다. W3C SPARQL 1.1 템플릿 규칙

PREFIX ex: <https://example.org/>
CONSTRUCT {
  ?order ex:detail _:row .
  _:row ex:sku ?sku .
}
WHERE {
  ?order ex:sku ?sku ;
         ex:tag ?tag .
  VALUES ?order { ex:o1 }
}

결과는 RDF 그래프로 합쳐집니다. 그러나 두 상세가 다른 노드라면 트리플의 주어나 목적어도 달라져 각각 남습니다. 설치된 엔진이 직렬화할 때 붙인 빈 노드 문자열을 세기보다 결과 그래프를 읽어 주문별 상세 연결을 확인합니다. 파일을 받은 뒤 구조가 같은지 비교하려면 RDF 파일 동형 비교 검수를 참고할 수 있습니다.

해를 줄이기 전에 무엇을 맞춰야 할까?#

상세가 주문·품목당 하나인지, 주문행마다 하나인지부터 정합니다. 주문·품목당 하나가 맞고 태그가 출력에 필요 없다면, 위 패턴을 주문·품목만 선택하는 SELECT DISTINCT 하위 질의 안에 넣어 템플릿 전에 해를 줄일 수 있습니다. 주문 안에 같은 품목의 서로 다른 주문행이 있다면 주문행 키도 보존합니다.

가상 표본상세 노드 / 트리플인수 판정
해 하나에서 라벨 재사용1 / 2주문의 상세 연결과 품목 값이 같은 빈 노드에 모임
태그 결합으로 해 둘2 / 4주문·품목이 같아도 해마다 별도 상세가 생김
주문과 SKU가 같은 해 정리1 / 2주문·품목 조합을 템플릿 전에 한 번만 남김
같은 주문에서 SKU가 둘2 / 4두 품목이 각각 남아야 함
발급된 상세 IRI 재사용1 / 2같은 IRI와 같은 트리플을 쓰면 그래프에서 합쳐짐
원천 빈 노드를 변수로 사용1 / 2두 해에서 같은 노드가 바인딩되면 그 참조가 유지됨
선택 SKU가 미바인딩1 / 1주문과 상세 링크는 남고 품목 트리플은 빠짐
가상 조건 7개의 RDFLib 7.4.0 로컬 그래프 결과입니다. 노드 수는 주문이 상세 관계로 가리키는 서로 다른 노드 수입니다.

같은 데이터셋과 추론 설정에서 WHERE 결과를 먼저 확인한 뒤, 상세 노드 수와 주문별 관계를 결과 그래프에서 대조합니다. 태그가 늘어날 때만 상세가 늘어나는지 확인하고, 주문행을 합치면 안 되는 반례도 함께 둡니다. 수량 합계가 늘어나는 경우는 온톨로지 조인 중복 집계 검수, 조회 범위가 달라지는 경우는 SPARQL 데이터셋 검수에서 다룹니다.

결과를 다시 적재할 때 무엇이 달라질까?#

빈 노드 라벨은 출력 일회분 안에서만 사용합니다. 다음 실행에서도 다른 시스템이 같은 상세를 업데이트해야 한다면, 주문행 같은 원천 키와 발급 범위를 합의한 뒤 그에 대응하는 IRI를 사용합니다. 서로 다른 원천이 같은 키 형식을 쓰면 원천 구분도 필요합니다. IRI가 같아도 값이 서로 다르면 두 트리플이 남을 수 있으므로 충돌 처리나 재적재 정책은 따로 검수합니다.

미바인딩 변수에 기대는 트리플이 빠져도 나머지 트리플은 남을 수 있습니다. 품목이 필수인 계약에서 주문과 상세 링크만 있는 그래프는 실패 표본으로 둡니다. 품목이 선택이라면 링크만 있는 상태를 허용할지 소비 시스템과 합의합니다.

출처와 적용 범위#

W3C의 2013년 3월 21일 SPARQL 1.1 권고와 2026년 11월 12일 SPARQL 1.2 작업 초안을 2026년 11월 14일 확인했습니다. 두 문서에서 템플릿의 빈 노드 규칙을 대조했습니다. 표는 한 로컬 엔진의 가상 결과이며, 실제 엔진과 내보내기·적재 환경은 같은 입력으로 확인해야 합니다. SPARQL 1.1 CONSTRUCT SPARQL 1.2 작업 초안

알파카랩스는 공개 서비스에서 원천 식별자와 개념·관계 매핑, 대표 질문과 검수 표본을 협의한다고 안내합니다. 템플릿 선택과 재적재 규칙은 실제 원천·소비 시스템에 맞춰 정합니다. 온톨로지 구축 서비스

자주 묻는 질문#

템플릿에서 같은 라벨을 두 번 쓰면 같은 노드인가요?

한 해에서 같은 라벨을 쓰면 같은 빈 노드를 가리킵니다. 다른 해에서 템플릿을 평가하면 별도 빈 노드를 만듭니다.

SELECT DISTINCT를 쓰면 주문마다 상세가 하나인가요?

유일성을 판정하는 것은 선택한 변수의 조합입니다. 주문과 품목을 선택하면 품목이 다른 경우 두 해가 남습니다. 상세가 주문행 단위라면 주문행 키도 선택합니다.

원천에서 읽은 빈 노드도 해마다 새로 만드나요?

같은 질의 실행에서 두 해가 변수에 같은 원천 빈 노드를 바인딩하면 템플릿에 그 참조를 사용합니다. 템플릿 자체에 빈 노드 라벨을 적었을 때 적용하는 새 노드 생성 규칙과 다릅니다.

출력의 빈 노드 라벨로 다음 날 같은 상세를 찾을 수 있나요?

별도 실행이나 파일 사이에서 라벨이 같은 대상을 뜻한다고 가정할 수 없습니다. 여러 실행이 같은 업무 항목을 이어서 참조해야 한다면 합의한 업무 키와 IRI 발급 규칙을 사용합니다.

품목 변수가 비면 주문과 상세 링크도 사라지나요?

빠지는 것은 바인딩되지 않은 변수를 포함한 트리플입니다. 주문과 상세 링크에 그 변수가 없으면 링크가 남고 품목 값만 빠질 수 있습니다.

출력 검수표 준비#

비식별 원천 표본, 대상 질의, 주문별 기대 상세 수와 업무 키를 준비합니다. 한 품목이 여러 행에 반복되는 표본과 실제로 서로 다른 품목이 있는 표본을 함께 가져오십시오.

그래프 출력의 인수 기준을 정리합니다

첫 범위 협의에서 비식별 원천과 질의 결과로 출력 검수표 초안을 정리합니다. 소요 시간은 관계와 조회 범위를 확인한 뒤 협의합니다.

그래프 출력 검수표 초안 협의