2015-01-03 11 views
2

SPARQL DELETE/INSERT을 사용하여 반복적으로 업데이트 한 후 ?performance과 연결된 특정 빈 노드에 여러 속성 값이 있지만 0 개 (선택 사항 인 경우) 또는 1 개 (필수 경우) 만 사용해야합니다.DELETE/INSERT 작업은 빈 노드를 포함하는 트리플을 제거하는 데 사용할 수 있습니다.

Jena Fuseki 1.1.1 서버에 DELETE/INSERT (아래 참조)를 보내면 "DELETE 템플릿에서 빈 노드를 사용할 수 없습니다"라는 오류 메시지가 나타납니다.

그러나이 사양에는 "DELETE/INSERT 작업을 사용하여 빈 노드가 포함 된 트리플을 제거 할 수 있습니다."

이 경우 작업을 수행하는 올바른 형태의 DELETE/INSERT가 무엇입니까? 유지 보수를 쉽게하기 위해 DELETE 및 INSERT 부분이 구조적으로 유사하게 유지 될 수 있다면 좋을 것입니다. (이것은 follow-up 질문입니다.)

DELETE { 
    ?performance 
     mo:performer ?_ ; 
     mo:singer ?_ ; 
     mo:performance_of [ ### error marked here ### 
      dc:title ?_ ; 
      mo:composed_in [ a mo:Composition ; 
       mo:composer ?_ 
      ] 
     ] 
} 
INSERT { 
    ?performance 
     mo:performer ?performer ;  # optional 
     mo:singer ?singer ;  # optional 
     mo:performance_of [ 
      dc:title ?title ;   # mandatory 
      mo:composed_in [ a mo:Composition ; 
       mo:composer ?composer # optional 
      ] 
     ] 
} 
WHERE {} 
+0

이 문장에서 문제가 발생했음을 이제는 추측합니다. "그래프 패턴의 빈 노드는 참조가 아닌 변수로 사용됩니다. 질의되는 데이터의 특정 빈 노드에 적용됩니다. " 그것들을'_ : b1','_ : b2','_ : b3'라고하면 ... – Drux

답변

5

당신은 WHERE 부분에 뭔가가 필요합니다. 그러면 b 노드를 찾아서 변수에 넣고 DELETE를 사용하여 제거합니다. DELETE {} 자체는 패턴 일치가 아니며 그래프 패턴은 WHERE {} 부분입니다.

뭔가 같은 :

DELETE{ 
    ?performance 
     mo:performance_of ?X . 
    ?X dc:title ?title ; 
     mo:composed_in ?Y . 
    ?Y a mo:Composition . 
    ?Y mo:composer ?composer . 
    ?performance mo:performer ?performer ; 
        mo:singer ?singer 
} 
WHERE { 
    ?performance 
     mo:performance_of ?X . 
    ?X dc:title ?title ; 
     mo:composed_in ?Y . 
    ?Y a mo:Composition . 
    OPTIONAL { ?Y mo:composer ?composer } 
    OPTIONAL { 
      ?performance mo:performer ?performer ; 
         mo:singer ?singer 
    } 
} 

아무 소용이 삭제 {}과 같은} {INSERT 만드는 없습니다 있습니다 - 그것은 효과적으로 어떤 조합 없습니다.

bout의 변수가 WHERE {} 부분의 특정 행에 바인딩 된 경우 삭제는 인스턴스화 된 나머지 템플릿이 아닌 해당 트리플을 건너 뜁니다.

사람들에게 SPARQL 업데이트를 여러 부분으로 작성하는 것이 더 명확 할 수 있습니다. 하나의 HTTP 요청은 ";"로 구분 된 여러 작업을 가질 수 있습니다.

DELETE{} WHERE {} ; 
DELETE{} WHERE {} ; 
INSERT DATA{} 
+0

Thx! 어떻게 이것이 삭제 단계를 처리 할 수 ​​있는지 봅니다. 축약 된'[...]'문법을 사용하기를 바란다. 빈 노드가있는 맹목적인 골목길을 보냈다. SPARQL DELETE/INSERT가 여기에 어떻게 적용되지 않는지도 알 수 있습니다. 내가 지금 보지 못하는 것은 (거의 별개의)'DELETE {} WHERE {}'와'INSERT {}'단계 모두에서 "거의"같은 문장을 반복하는 것을 피할 수있는 방법이다. 'INSERT {}'가 공백 노드 (예 :'_ : X')를 사용하는 반면'DELETE {} WHERE {}'는 변수 (예 :'X')를 사용한다는 점을 제외하고는 동일합니다 (최소한 새로운 SPARQL 업데이트에서는 지금 사용하고있는 것 같습니다.) – Drux

+0

INSERT는 새로운 빈 노드를 삽입합니다. 축 어적 삭제는 OPTIONAL의 사용을 제외하고 DELETE WHERE를 사용하여 처리 할 수 ​​있습니다. "거의 같은"것은 "같은"것이 아닙니다. – AndyS