Вот мой запрос:SPARQL рассчитывать не существующие свойства, как нулевой
PREFIX : <http://example.org/ns#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT ?id ?name (count(?s) as ?count)
WHERE {
?t a :Tag ;
:hasId ?id ;
:hasName ?name
OPTIONAL { ?s :hasTag ?t ;
rdf:type ?type }
FILTER (?type in (:Client, :Project, :Staff))
} GROUP BY ?id ?name
Теги без каких-либо объектов, которые не включены в результат. Как я могу получить их, не используя союз? Эффективность также важна.
Целью является сбор информации о тегах (id, name) и количестве объектов, которые они назначают (если таких объектов не должно быть 0). Пример данных тегов:
:tag912 :hasId "912"^^xsd:integer
:tag912 :hasName "Phones"
Этот тег относится к 6 объектам.
Этот запрос работает для меня:
PREFIX : <http://example.org/ns#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
SELECT ?id ?name ?count
WHERE {
{
SELECT ?id ?name (count(?s) as ?count)
WHERE {
?t a :Tag ;
:hasId ?id ;
:hasName ?name .
?s :hasTag ?t ;
rdf:type ?type
FILTER (?type in (:Client, :Project, :Staff))
} GROUP BY ?id ?name
} UNION {
SELECT ?id ?name (0 as ?count)
WHERE {
?t a :Tag ;
:hasId ?id ;
:hasName ?name
FILTER not exists { ?s :hasTag ?t }
}
}
}
Как я могу использовать привязок здесь? Улучшит ли производительность? Спасибо
Было бы неплохо, если бы вы предоставили дополнительную информацию, среди прочего, цель запроса, образцы данных и т. Д. – AKSW
И вы хотите иметь количество объектов, у которых нет тега? Вы знаете, как получить только количество тегов, у которых нет тега? С вашим запросом я не вижу способа избежать объединения или подвыборки, поскольку вы группируете по тегу Id и имени тега, так что должно быть id или. имя, которое обозначает немаркированные объекты? BIND + IF-ELSE может быть возможностью привязать тег «немаркированный» к тем объектам, у которых нет тега – AKSW
Спасибо за ответ, я добавил более подробную информацию к вопросу. Как я могу использовать BIND + IF-ELSE здесь? Поскольку я думаю, что это должно быть быстрее, чем объединение – anku