SPARQL Negation: все foaf: Агенты, которые не являются foaf: Лица
Я пытаюсь написать запрос SPARQL, который должен дать мне все foaf:Agents
, которые не являются foaf:Persons
.
Я не вижу способа применить эту конструкцию OPTIONAL/BOUND к этой проблеме, потому что все свойства, такие как rdfs:subClassOf
и rdf:type
, являются транзитивными и рефлексивный.
Я пробовал это:
SELECT * WHERE {
?x rdf:type foaf:Agent
OPTIONAL { ?y rdf:type foaf:Person }
FILTER ( !BOUND(?y) ) }
Но rdf: тип кажется транзитивным, по крайней мере, с JENA/ARQ/SDB.
Ответы
Ответ 1
Причина, по которой это не работает, состоит в том, что у вас есть две отдельные привязки переменных (?x
и ?y
), которые не связаны в вашем запросе. Поэтому ?x
должен быть связан, чтобы появляться в наборе результатов (это то, что вы хотите), но если ?y
несвязано, вы не узнали ничего нового о ?x
.
Обновление: в идеальном запросе вообще не нужно будет ?y
; вы можете напрямую проверить входящие/исходящие сообщения ?x
. Это сложно (невозможно?) Сделать в SPARQL 1.0, если вы хотите проверить, не существует ли край при привязке данной переменной. Однако SPARQL 1.1 будет поддерживать поддержку отрицания:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
SELECT ?agent
WHERE
{
?agent rdf:type foaf:Agent .
NOT EXISTS { ?agent rdf:type foaf:Person . }
}
Подход @Kingsley Idehen (с использованием сторонних расширений SPARQL) должен помочь вам решить проблему в краткосрочной перспективе.
Ответ 2
Для этого в SPARQL 1.0 вам нужно будет:
SELECT * WHERE {
?x rdf:type foaf:Agent
OPTIONAL { ?y rdf:type foaf:Person . FILTER (?x = ?y) . }
FILTER ( !BOUND(?y) )
}
Как говорит Фил М., SPARQL 1.1 представит новый синтаксис, чтобы сделать это гораздо проще писать.
Ли
Ответ 3
Здесь (черновик) спецификации SPARQL 1.1 для отрицания: http://www.w3.org/TR/sparql11-query/#negation
Ответ 4
Через Virtuoso SPARQL Extensions конечная точка для проверки http://lod.openlinksw.com/sparql (LOD Cloud Cache Instance)
SELECT различный? x? o
WHERE {
? x a foaf: Агент.
? x? p? o.
filter (! bif: существует ((выберите (1) где {? x a foaf: Person})))
}
предел 10
ОПИСАТЬ? x
WHERE {
? x a foaf: Agent.
filter (! bif: exists ((выберите (1) где {? x a foaf: Person})))
}
предел 200
Ответ 5
Теперь работает, любезно предоставлено SPARQL 1.1:
PREFIX rdf: http://www.w3.org/1999/02/22-rdf-syntax-ns#
PREFIX foaf: http://xmlns.com/foaf/0.1/
SELECT DISTINCT COUNT (? agent)
WHERE
{ ? agent rdf: type foaf: Agent.
FILTER (NOT EXISTS { ?agent rdf:type foaf:Person . })
}
Ссылки на живые примеры: