Допустим, у меня есть следующее:
@prefix hr: <http://learningsparql.com/ns/humanResources#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
hr:Employee a rdfs:Class .
hr:BadThree rdfs:comment "some comment about missing" .
hr:BadTwo a hr:BadOne .
hr:YetAnother a hr:Another .
hr:YetAnotherName a hr:AnotherName .
hr:Another a hr:Employee .
hr:AnotherName a hr:name .
hr:BadOne a hr:Dangling .
hr:name a rdf:Property .
, и я запускаю следующий запрос SPARQL:
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX sch: <http://schema.org/>
SELECT DISTINCT ?s
WHERE {
{
?s ?p ?o .
FILTER NOT EXISTS {
?s a ?c .
FILTER(?c IN (rdfs:Class, rdf:Property))
}
}
}
Возвращенные результаты будут:
----------------------------------------------------------------
| s |
================================================================
| <http://learningsparql.com/ns/humanResources#Another> |
| <http://learningsparql.com/ns/humanResources#BadOne> |
| <http://learningsparql.com/ns/humanResources#BadTwo> |
| <http://learningsparql.com/ns/humanResources#YetAnother> |
| <http://learningsparql.com/ns/humanResources#BadThree> |
| <http://learningsparql.com/ns/humanResources#AnotherName> |
| <http://learningsparql.com/ns/humanResources#YetAnotherName> |
----------------------------------------------------------------
Я хочу вернуть только два результата:
----------------------------------------------------------------
| s |
================================================================
| <http://learningsparql.com/ns/humanResources#BadOne> |
| <http://learningsparql.com/ns/humanResources#BadTwo> |
| <http://learningsparql.com/ns/humanResources#BadThree> |
----------------------------------------------------------------
Что делает их плохими? Если я смотрю на информацию rdf: type, цепочка типов не заканчивается в типе, который является rdfs: Class или rdf: Property.
Если я смотрю на hr: YetAnother, у него есть rdf: type часа: другое. hr: у другого есть rdf: тип hr: Employee. Итак, цепочка типов из hr: YetAnother и hr: Another заканчивается в rdfs: Class, и они не должны возвращаться запросом.
В моем примере цепочка типов мала, но их может быть больше ссылки в цепочке делают их длиннее.
Можно ли написать такой запрос с помощью SPARQL? Если да, то каким будет этот запрос?