Можно ли выполнить операцию INSERT с предложением GROUP BY в SPARQL/Update?

Предположим, у меня есть граф, содержащий учеников трех разных классов.

Пример графика:

<http://some/graph#John_Doe> rdf:type <http://some/graph/ontology#Student>
<http://some/graph#John_Doe> <http://some/graph#hasGrade> <http://some/graph#Grade_3>
<http://some/graph#Grade_3> rdf:type <http://some/graph/ontology#Grade>

Я хочу создать атрибут для каждого экземпляра класса Grade с именем gradeStrength для хранения количества учащихся в этом классе. оценка.

В приведенном выше примере это будет выглядеть так:

<http://some/graph#Grade_3> <http://some/graph#gradeStrength> 1^^xsd:integer

В настоящее время я делаю это, используя два отдельных запроса следующим образом:

  1. Запустите запрос SELECT + GROUP BY на графике, чтобы получить количество баллов для каждой оценки.
  2. Переберите строки результатов 1., чтобы создать строку троек.
  3. Запустите запрос обновления INSERT DATA на графе

Как этого добиться, используя один запрос SPARQL/Update с конструкциями INSERT и GROUP BY? Я попытался написать такой запрос, и он не работает в Blazegraph.


person 10J01    schedule 12.07.2020    source источник
comment
да, это возможно. Используйте INSERT {?grade <http://some/graph#gradeStrength> ?gradeStrength} WHERE { { SELECT ?grade (COUNT(?student) AS ?gradeStrength) { ?student <http://some/graph#hasGrade> ?grade} GROUP BY ?grade } } - (действительно не проверено)   -  person UninformedUser    schedule 12.07.2020
comment
@UninformedUser Я протестировал его с приведенными выше примерами данных и запросом на обновление, который вы предложили на blazegraph, и это сработало! Спасибо. Первый вопрос о stackoverflow - не знаю, как принять это как ответ и закрыть вопрос.   -  person 10J01    schedule 13.07.2020
comment
Вы можете просто добавить рабочий запрос в качестве ответа, а также нажать «Принять», чтобы получить собственный ответ. Это в основном пометит вопрос как решенный, тогда нет правильного закрытия   -  person UninformedUser    schedule 13.07.2020


Ответы (1)


Использовать

INSERT {
  ?grade <http://some/graph#gradeStrength> ?gradeStrength
} 
WHERE 
{ 
  { 
    SELECT ?grade (COUNT(?student) AS ?gradeStrength)  
    { 
      ?student  <http://some/graph#hasGrade> ?grade . 
    } 
    GROUP BY ?grade   
  } 
}

Ответ сделан из комментария @UninformedUser. Протестировано на Blazegraph путем загрузки примеров троек из вопроса.

person 10J01    schedule 13.07.2020