2017-01-10 12 views
1

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

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

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

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

Aggregate expression not legal at this point 
+2

RDF представляет собой набор троек. Любой заказ должен выполняться с помощью идентификаторов, введенных вами самим, а затем использование «ORDER BY» в запросе SPARQL. Все остальное было бы зависимым от реализации заказом без каких-либо гарантий. – AKSW

+1

Вы изменили ** весь вопрос **! Зачем ты это сделал? Мой комментарий не имеет никакого смысла сейчас ... – AKSW

+0

Ваш комментарий помог мне лучше понять проблему – Caleb

ответ

2

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

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 и использовать подзапрос (который проверяет ограничение количества свойств объекта) в сочетании с простым совпадением шаблонов.

EDIT Обратите внимание, что я слегка измененный исходное обновление: это вставки в другой именем графа от того, которую вы запрашиваете. Разумеется, вставка в один и тот же граф будет работать, но результаты не будут наблюдаемыми (поскольку вы просто вставляете те же данные, которые уже присутствовали на этом графике).

+0

Этот вопрос не работает в моей локальной Jena Fuseki. Только работает INSERT DATA, но не весь запрос. – Caleb

+0

Прежде всего, «это не работает» не является описанием проблемы. Что вы видите, и чего вы ожидали? Я отмечаю, что встроенные комментарии, которые я добавил здесь для пояснения, недействительны, я забыл, что SPARQL использует # вместо //. Я протестировал операцию в RDF4J, где она работает нормально. Разумеется, _result_ этой операции будет ничем, поскольку вы извлекаете данные из и вставляете данные в один и тот же граф. Если вы хотите наблюдать результаты, вам нужно будет изменить целевой граф по-другому. Я обновил свой ответ, чтобы показать это. –

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

  • Нет связанных вопросов^_^