Обновление 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 {}

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

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

Итак, как я могу поддерживать такие необязательные параметры в одном обновлении SPARQL? Например, есть ли какие-либо средства для «хранения» пустого узла между двумя INSERT?


person Drux    schedule 02.01.2015    source источник
comment
Навскидку я думаю, что вставка (как и конструкция) будет обрабатывать триплеты, которые работают, и игнорировать те, которые не работают. Например, если у вас есть ?person :name ?name ; :age ?age и у вас есть привязка только для ?age и ?person, вы должны получить тройку ?person :age ?age, а не тройку ?person :name ....   -  person Joshua Taylor    schedule 02.01.2015
comment
О, перечитав ваш вопрос, я понимаю, что вы имеете в виду. Пустой узел всегда связан, поэтому вы всегда получаете тройку [] a mo:Composition. Мой предыдущий комментарий мало помогает. Это интересный вопрос. Хороший улов! Мое первоначальное предположение заключалось в том, что вы могли бы использовать переменную вместо пустого узла и привязать ее к пустому узлу в запросе.   -  person Joshua Taylor    schedule 02.01.2015
comment
@JoshuaTaylor Да, ваш первый комментарий объясняет, почему необязательность для ?performer и ?singer работает. Но что делать с менее тривиальным случаем ?composer?. Привязка пустого узла звучит многообещающе (если это действительно возможно — я пока не знаю, как это сделать).   -  person Drux    schedule 02.01.2015
comment
Я не уверен навскидку, но вы можете попробовать поместить переменную вместо буквального синтаксиса пустого узла, а затем привязать переменную к пустому узлу с помощью параметризованной строки sparql.   -  person Joshua Taylor    schedule 02.01.2015


Ответы (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 {}

Снимаю шляпу перед Джошуа Тейлором за лидерство.

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

person Drux    schedule 02.01.2015
comment
Я бы все же предпочел автономную версию, которая не требует дополнительного параметра ?performer (т.е. работает без дополнительных требований к вызывающей стороне), если это вообще возможно. Можете пояснить, что вы имеете в виду под этим? Вы хотите, чтобы ?performer также был необязательным? Если вы просто не предоставляете привязку для ?performer, вы все равно должны получить остальные триплеты... И, чтобы было ясно, если у вас есть значение либо ?title или ?composition, вы получите по крайней мере одну тройку из-за пустого узла. - person Joshua Taylor; 02.01.2015
comment
@JoshuaTaylor Обновление SPARQL вызывается из клиента Java. Он имеет естественные знания о трех (теперь уже четырех) параметрах: ?performer, ?singer, ?composer. Теперь он должен правильно установить четвертый (т.е. ?composition), который, ИМХО, является (крошечным) неудачным битом, потому что это распределяет логику для вставки между двумя местами. - person Drux; 02.01.2015
comment
Вы написали автономную версию, для которой не требуется дополнительный параметр ?performer Вы имели в виду автономную версию, для которой не требуется дополнительный параметр ?состав? - person Joshua Taylor; 02.01.2015
comment
@JoshuaTaylor Опечатка/извините. - person Drux; 02.01.2015