2015-01-03 4 views
2

Я хотел бы использовать SPARQL DELETE/INSERT, чтобы убедиться, что после повторных обновлений ?performance и некоторые связанные пустые узлы не имеют нескольких значений свойств, но только ноль (для необязательных случаев) или один (для обязательных случаев).Операция DELETE/INSERT может использоваться для удаления троек, содержащих пустые узлы: как?

Если я отправлю DELETE/INSERT (см. Ниже) на сервер Jena Fuseki 1.1.1, я получаю следующее сообщение об ошибке: «Пустые узлы не допускаются в шаблонах 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 части. Это найдет bnodes, поместит их в переменные и с помощью 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 
    } 
} 

Существует нет смысла делать DELETE {} и {} ВСТАВИТЬ же - это не эффективно не оп.

Если переменная в боте, связанная в определенной строке с частью WHERE {}, удаление просто пропускает эту тройку, а не весь экземпляр шаблона.

Для людей может быть яснее написать SPARQL Update в нескольких частях. Один HTTP-запрос может иметь несколько операций, разделенных символом «;»:

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

Thx! Я вижу, как это может обрабатывать шаг удаления. Желание использовать сокращенный синтаксис [...] 'прислал мне неправильный тупик с пустыми узлами. Теперь я могу видеть, как здесь не применяется SPARQL DELETE/INSERT. То, что я еще не вижу, - это то, как я могу избежать повторения «почти» дословно таких же операторов в обоих (теперь отдельно) 'DELETE {} WHERE {}' и 'INSERT {}' шагах. Они одинаковы, за исключением того, что 'DELETE {} WHERE {}' использует переменные (например, '? X'), тогда как' INSERT {} 'использует пустые узлы (например,' _: X') (по крайней мере, в новом обновлении SPARQL я теперь использование и, похоже, работает.) – Drux

+0

INSERT вставляет новые пустые узлы. Удаление Verbatim можно обрабатывать с помощью DELETE WHERE, за исключением использования OPTIONAL. «Почти то же самое» не является «тем же». – AndyS

 Смежные вопросы

  • Нет связанных вопросов^_^