Причина, по которой это не работает, заключается в том, что у вас есть две отдельные привязки переменных (?x
и ?y
), которые не связаны в вашем запросе. Таким образом, ?x
должен обязательно появиться в наборе результатов (что вам нужно), но если ?y
не связан, вы не узнали ничего нового о ?x
.
Обновление: в идеальном запросе вообще не нужно было бы ?y
; Вы можете проверить входящие / исходящие edegs ?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 .
FILTER NOT EXISTS { ?agent rdf:type foaf:Person . }
}
@ Подход Кингсли Идеена (с использованием сторонних расширений SPARQL) должен помочь вам решить проблему в краткосрочной перспективе.