Можно ли следовать цепочке типов, чтобы проверить, где она заканчивается? - PullRequest
1 голос
/ 08 апреля 2020

Допустим, у меня есть следующее:

@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? Если да, то каким будет этот запрос?

1 Ответ

1 голос
/ 09 апреля 2020

Функция SPARQL, необходимая для решения этой проблемы, называется Пути к свойствам .

Следующий запрос:

SELECT DISTINCT ?s
WHERE {
    {
        ?s ?p ?o .    
        FILTER NOT EXISTS {
            ?s rdf:type* ?c .
             FILTER(?c IN (rdfs:Class, rdf:Property) && ?s NOT IN (rdfs:Class, rdf:Property) )
        }
    }
}

вернет ожидаемые результаты:

----------------------------------------------------------
| s                                                      |
==========================================================
| <http://learningsparql.com/ns/humanResources#BadOne>   |
| <http://learningsparql.com/ns/humanResources#BadTwo>   |
| <http://learningsparql.com/ns/humanResources#BadThree> |
----------------------------------------------------------

Если разбить запрос, чтобы лучше понять, что происходит, рассмотрим,

(A)

SELECT DISTINCT *
WHERE {
    {
        ?s ?p ?o .       
    }
}

, который выдаст следующие результаты:

-------------------------------------------------------------------------------------------------------------------------------------------
| s                                                            | p            | o                                                         |
===========================================================================================================================================
| <http://learningsparql.com/ns/humanResources#Another>        | rdf:type     | <http://learningsparql.com/ns/humanResources#Employee>    |
| <http://learningsparql.com/ns/humanResources#BadOne>         | rdf:type     | <http://learningsparql.com/ns/humanResources#Dangling>    |
| <http://learningsparql.com/ns/humanResources#BadTwo>         | rdf:type     | <http://learningsparql.com/ns/humanResources#BadOne>      |
| <http://learningsparql.com/ns/humanResources#Employee>       | rdf:type     | rdfs:Class                                                |
| <http://learningsparql.com/ns/humanResources#YetAnother>     | rdf:type     | <http://learningsparql.com/ns/humanResources#Another>     |
| <http://learningsparql.com/ns/humanResources#BadThree>       | rdfs:comment | "some comment about missing"                              |
| <http://learningsparql.com/ns/humanResources#AnotherName>    | rdf:type     | <http://learningsparql.com/ns/humanResources#name>        |
| <http://learningsparql.com/ns/humanResources#name>           | rdf:type     | rdf:Property                                              |
| <http://learningsparql.com/ns/humanResources#YetAnotherName> | rdf:type     | <http://learningsparql.com/ns/humanResources#AnotherName> |
-------------------------------------------------------------------------------------------------------------------------------------------

, затем рассмотрим следующий запрос:

(B)

SELECT DISTINCT ?s
WHERE {
    {
        ?s rdf:type* ?c .
        FILTER(?c IN (rdfs:Class, rdf:Property) && ?s NOT IN (rdfs:Class, rdf:Property) )

    }
}

, который возвращает результаты:

----------------------------------------------------------------
| s                                                            |
================================================================
| <http://learningsparql.com/ns/humanResources#Employee>       |
| <http://learningsparql.com/ns/humanResources#Another>        |
| <http://learningsparql.com/ns/humanResources#YetAnother>     |
| <http://learningsparql.com/ns/humanResources#name>           |
| <http://learningsparql.com/ns/humanResources#AnotherName>    |
| <http://learningsparql.com/ns/humanResources#YetAnotherName> |
----------------------------------------------------------------

Поместив (B) в FILTER NOT EXISTS, объекты, найденные в (A) удаляются, оставляя только желаемые результаты.

...