Запрос на вставку SPARQL не вставляется

Когда я запускаю это обновление SPARQL:

INSERT {
  GRAPH <n4> {
    ?s foaf:firstName ?o
  }
}
WHERE {
  GRAPH <n1> {
    ?s foaf:familyName ?o .
    ?o foaf:familyName ?x
  }
}

Хотя синтаксически это нормально, я не получаю результатов. Это потому, что ?s из предложения INSERT нельзя связать одновременно с ?s и ?o?


person Cheryl    schedule 04.09.2013    source источник


Ответы (2)


Ваш запрос синтаксически хорош для SPARQL, но шаблоны, которым он будет соответствовать, вероятно, в большинстве случаев не являются допустимыми RDF. В частности, маловероятно, что этот паттерн:

?s foaf:familyName ?o .
?o foaf:familyName ?x

когда-либо будет соответствовать вашим данным. Значение ?o, скорее всего, будет строкой, которая является литералом RDF, а литералы не могут быть объектами троек в RDF, поэтому очень маловероятно, что ?o foaf:familyName ?x когда-либо сможет соответствовать. Поскольку это означает, что ни одна тройка не будет соответствовать части запроса WHERE, вставлять нечего. Я бы посоветовал вам сначала запустить

SELECT ?s ?o WHERE {
  GRAPH <n1> {
    ?s foaf:familyName ?o .
    ?o foaf:familyName ?x
  }
}

чтобы увидеть, какие значения ?s и ?o будут доступны для INSERT. Я ожидаю, что вы не увидите никаких результатов, и поэтому вы не вставляете троек в n4.

Что касается конкретного вопроса, который вы задали,

Это потому, что ?s из предложения INSERT нельзя связать одновременно с ?s и ?o?

нет проблем с одновременным связыванием. Часть запроса WHERE дает (возможно, пустой) набор результатов, каждый из которых связывает ?s, ?o и ?x. Затем для каждого решения значения ?s и ?o используются для построения тройки value-of-s foaf:firstName value-of-o, и все эти тройки вставляются в n4. В n4 ничего не вставляется, потому что набор результатов пуст (по причинам, описанным выше).

person Joshua Taylor    schedule 04.09.2013
comment
У меня есть тройки типа ‹iri1› foaf: familyName ‹iri2›, поэтому шаблон выше должен совпадать. Я запускаю предложенный вами SELECT, и вы правы, я не получаю результата, но все еще не могу объяснить, почему. - person Cheryl; 04.09.2013
comment
@Cheryl То, что у вас есть IRI в качестве фамилии, кажется мне немного странным, но это совершенно законно. Однако для соответствия ?s familyName ?o . ?o familyName ?x вам потребуются данные в форме <iri1> familyName <iri2> и <iri2> familyName <iri3>. У вашей фамилии <iri2> есть также фамилия <iri3>? Шаблон весь в WHERE должен совпадать, включая ?o familyName ?x, даже если ?x не используется в части INSERT. - person Joshua Taylor; 04.09.2013
comment
Да, у меня есть ‹iri1› familyName ‹iri2›, ‹iri2› familyName ‹iri3›, ‹iri3› familyName ‹iri4› и т. Д. - person Cheryl; 04.09.2013
comment
@Cheryl Пожалуйста, добавьте свои данные к вопросу. Если ваши данные действительно имеют <iri1> familyName <iri2> и <iri2> familyName <iri3> на графике <n1>, то запрос выбора должен их получить. Либо данных нет в <n1>, либо у них нет описанной вами формы, либо и то, и другое. - person Joshua Taylor; 04.09.2013
comment
Решаю проблему это было за счет реализации Jena Fuseki. Когда я создаю явно ‹n4›, это дает мне правильные результаты. - person Cheryl; 04.09.2013
comment
@Cheryl Если вы нашли решение, можете ли вы опубликовать его в качестве ответа (и принять его), чтобы другие пользователи, которые могут столкнуться с той же проблемой, могли его найти? Обязательно укажите конкретную версию Fuseki, которую вы используете. Согласно разделу 3.1 Graph Update спецификации SPARQL 1.1, «Не пустые вставки в несуществующие графы, однако, неявно создадут эти графы », поэтому, если вы обнаружили случай, когда этого не происходит, вы также должны сообщить об этом разработчикам Jena. Однако, если вы используете старую версию, возможно, она была исправлена ​​... - person Joshua Taylor; 04.09.2013
comment
Большое спасибо, Джошуа - person Cheryl; 06.09.2013

Я использовал версию Jena Fuseki 0.2.7. Я думаю, проблема заключалась в том, что мне пришлось явно создать график, а затем запустить обновление INSERT. Это работает для одного графика, хотя, если вы хотите оценить шаблон groupgraph для более крупного набора данных (например, n1, n2, n3), это не даст вам результатов.

person Cheryl    schedule 06.09.2013
comment
Можете ли вы пояснить, что вы имеете в виду, оценивая шаблон groupgraph для более крупного набора данных? - person Joshua Taylor; 06.09.2013
comment
И более конкретно, вы имеете в виду, что делать это, например, с where { values ?graph { <n1> <n2> <n3> } graph { ?s name ?o . ?o name ?x } } не работает? - person Joshua Taylor; 06.09.2013