Можно ли использовать агрегатную функцию при вставке данных в SPARQL?

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

Я попытался воспроизвести пример, показанный здесь, где возможна вставка данных но мне нужно использовать тот же именованный график и, что наиболее важно, агрегатную функцию, т. е. COUNT.

INSERT 
  { 
    GRAPH <http://example/g1> { ?s ?p ?o } 
  }
WHERE
  { 
  GRAPH  <http://example/g1>
   { 
    ?s ?p ?o .
    FILTER ( COUNT(?p) < 5)
   } 
}  

Jena Fuseki вызывает следующую ошибку:

 Aggregate expression not legal at this point

person Caleb    schedule 10.01.2017    source источник
comment
RDF представляет собой набор троек. Любой порядок должен быть выполнен с точки зрения идентификаторов, введенных вами, и тогда действительно требуется использование ORDER BY в запросе SPARQL. Все остальное было бы порядком, зависящим от реализации, без каких-либо гарантий.   -  person UninformedUser    schedule 10.01.2017
comment
Вы изменили весь вопрос! Зачем ты это сделал? Мой комментарий сейчас не имеет смысла...   -  person UninformedUser    schedule 11.01.2017
comment
Ваш комментарий помог мне лучше понять проблему   -  person Caleb    schedule 11.01.2017
comment
Хорошо, но в следующий раз, пожалуйста, откройте новый вопрос. Другим людям может понадобиться помощь по той же проблеме, которой здесь больше не существует.   -  person UninformedUser    schedule 11.01.2017
comment
AKSW Я не видел оригинала, но разве не в этом был смысл вашего комментария? Было бы иначе, если бы на исходный вопрос можно было ответить....   -  person Jeen Broekstra    schedule 11.01.2017


Ответы (1)


Да, это возможно:

INSERT 
  { 
    GRAPH <http://example/g2> { ?s ?p ?o } 
  }
WHERE
{ 
  GRAPH <http://example/g1> {
    ?s ?p ?o .           # select all triples
    { SELECT ?s          # do a check for the selected subject
      WHERE { GRAPH <http://example/g1> { ?s ?p ?o } }
      GROUP BY ?s            # count properties per subject
      HAVING (COUNT(?p) < 5) # only subjects with less than 5 properties 
    }
  }
}

Прежде всего, агрегатные операторы не могут быть помещены в предложение FILTER, чтобы использовать их в качестве условного оператора, вы должны вместо этого поместить их в предложение HAVING.

Кроме того, поскольку вы хотите подсчитывать свойства для каждого субъекта, вы должны использовать GROUP BY ?s и использовать подзапрос (который проверяет ограничение на количество свойств для субъекта) в сочетании с простым сопоставлением с образцом.

ИЗМЕНИТЬ Обратите внимание, что я немного изменил ваше исходное обновление: оно вставляется в график с именем отличается от того, который вы запрашиваете. Вставка в тот же именованный график, конечно, будет работать, но результаты не будут видны (поскольку вы просто вставляете те же данные, которые уже присутствовали в этом графике).

person Jeen Broekstra    schedule 11.01.2017
comment
Этот запрос не работает в моем местном Jena Fuseki. Работает только INSERT DATA, но не весь запрос. - person Caleb; 11.01.2017
comment
Во-первых, не работает - это не описание проблемы. Что вы видите и чего ожидаете? Я отмечаю, что встроенные комментарии, которые я добавил здесь для пояснения, недействительны, я забыл, что SPARQL использует # вместо //. Я протестировал операцию в RDF4J, где она работает нормально. Конечно, результатом этой операции будет ничего, так как вы извлекаете данные из графа с тем же именем и вставляете данные в него. Если вы хотите наблюдать за результатами, вам придется изменить целевой именованный график на что-то другое. Я обновил свой ответ, чтобы показать это. - person Jeen Broekstra; 12.01.2017