2015-01-02 2 views
1

Рассмотрим следующее обновление SPARQL:SPARQL обновление с дополнительными частями

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 {} 

Если я не предоставлю значения (например, в Jena-х ParameterizedSparqlString.setIri() для ?performer, ?singer или ?composer, это обновление не будет вставлять заявления с соответствующими объектов, который, как предполагалось.

Но как я могу подавить [] a mo:Composition, а если ?composer отсутствует. Создание его второй INSERT, чьи WHERE фильтры на ISIRI(?composer), кажется, не быть одним из вариантов, потому, что INSERT Wo не знаю пустого узла, который уже был создан первым.

Итак, как я могу поддерживать этот тип дополнительных параметров в одном обновлении SPARQL? Например, существуют ли какие-либо средства для «хранения» пустого узла между двумя ВСТАВКАМИ?

+0

Оффлайн, я * думаю *, что вставка (как и конструкция) будет обрабатывать тройки, которые работают, и игнорировать те, которые этого не делают. Например, если у вас есть '? Person: name? Name; : age? age', и у вас есть только привязка для '? age' и'? person', вы * должны * получить символ '? person: age? age', а не'? person: name ... ' троек. –

+0

О, перечитывая свой вопрос, я понимаю, что вы имеете в виду. Пустой узел всегда связан, поэтому вы всегда получаете '[] тройку mo: Composition'. Мой предыдущий комментарий не очень помогает. Это интересный вопрос. Хороший улов! Мое первоначальное предположение заключалось в том, что вы могли бы использовать переменную вместо пустого узла и привязать ее к пустому узлу в запросе. –

+0

@JoshuaTaylor Да, ваш первый комментарий объясняет, почему работает опция «исполнитель» и «певец». Но что делать с менее тривиальным случаем «композитор» ?. BINDing пустой узел звучит многообещающе (если это действительно возможно - я пока не знаю, как). – Drux

ответ

1

Следующие действия работают, когда вызывающий абонент устанавливает composition на пустой узел тогда и только тогда, когда он устанавливает ?composer в IRI.

if (composer != null) { 
    parameterizedSparqlString.setIri ("composer" , composer); 
    parameterizedSparqlString.setParam("composition", NodeFactory.createAnon()); 
} 

INSERT { 
    ?performance 
     mo:performer ?performer ; # optional 
     mo:singer ?singer ; # optional 
     mo:performance_of [ 
      dc:title ?title ;    # mandatory 
      mo:composed_in ?composition ] . # optional 
    ?composition a mo:Composition ; 
     mo:composer ?composer . 
} 
WHERE {} 

Шляпы прочь @Joshua Тейлора для свинца.

Я бы предпочел автономную версию, которая не требует дополнительного параметра ?composition (т. Е. Работает без дополнительных требований к вызывающему абоненту), если это вообще возможно.

+0

«Я по-прежнему предпочитаю автономную версию, которая не требует дополнительного параметра« performer »(т. Е. Работает без дополнительных требований к вызывающему абоненту), если это вообще возможно». Можете ли вы пояснить, что вы подразумеваете под этим? Разве это то, что вы хотите, чтобы исполнитель был необязательным? Если вы просто не предоставляете привязку к «исполнителю», вы все равно должны получить оставшуюся часть троек ... И чтобы быть понятным, если у вас есть значение * или *? Title или? с по меньшей мере одной тройкой из-за пустого узла. –

+0

@JoshuaTaylor Обновление SPARQL вызывается с Java-клиента. Он имеет естественные знания о трех (из четырех) параметров: '? Performer','? Singer', '? Composer'. Теперь он должен правильно установить четвертый (i, e. '? Compos'), который IMHO является (крошечным) бит неудачным, потому что это расширяет логику для вставки между двумя местами. – Drux

+0

Вы написали * "автономную версию, которая не требует дополнительного параметра **? Performer **" * Вы имели в виду * "автономную версию, которая не требует дополнительного параметра **? Composition **" * ? –

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