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 представит новый синтаксис, чтобы сделать это гораздо проще писать.

Ли

Ответ 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