Почему этот запрос SPARQL возвращает определенные элементы как темы? - PullRequest
2 голосов
/ 21 апреля 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 sch: <http://schema.org/> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .

hr:Another a rdfs:Class .

hr:Employee a rdfs:Class ;
    rdfs:label "model" ;
    rdfs:comment "a good employee" .

hr:Longer a hr:Employee ;
    rdfs:label "model" ;
    rdfs:comment "a good employee" .

hr:freestanding a rdf:Property ;
    sch:rangeIncludes sch:Text .

hr:missing rdfs:comment "some comment about missing" .

hr:name a rdf:Property ;
    sch:domainIncludes hr:Employee .

hr:nosuper a rdf:Property ;
    sch:domainIncludes hr:Uncreated ;
    sch:rangeIncludes sch:Text .

hr:randomtype a hr:invalidtype ;
    rdfs:label "some label about randomtype" ;
    rdfs:comment "some comment about randomtype" .

hr:typo a rdfs:Classs ;
    rdfs:label "some label about typo" ;
    rdfs:comment "some comment about typo" .

Единственными предметами, определенными в тройках, являются hr: Другой, hr: Сотрудник, hr: Больше, hr: отдельно стоящий, hr: отсутствует, hr: имя , hr: nosuper, hr: randomtype и hr: typo. В качестве доказательства, когда я запускаю запрос:

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

, я получаю результат:

--------------------------------------------------------------
| s                                                          |
==============================================================
| <http://learningsparql.com/ns/humanResources#freestanding> |
| <http://learningsparql.com/ns/humanResources#Another>      |
| <http://learningsparql.com/ns/humanResources#typo>         |
| <http://learningsparql.com/ns/humanResources#nosuper>      |
| <http://learningsparql.com/ns/humanResources#Employee>     |
| <http://learningsparql.com/ns/humanResources#randomtype>   |
| <http://learningsparql.com/ns/humanResources#Longer>       |
| <http://learningsparql.com/ns/humanResources#missing>      |
| <http://learningsparql.com/ns/humanResources#name>         |
--------------------------------------------------------------

Однако, если я выполню этот запрос SPARQL:

SELECT DISTINCT ?s
WHERE {
    {

            ?s rdf:type* ?o .    
    }
}

Я получаю следующие результаты:

--------------------------------------------------------------
| s                                                          |
==============================================================
| <http://learningsparql.com/ns/humanResources#Longer>       |
| rdfs:Class                                                 |
| sch:Text                                                   |
| "some comment about typo"                                  |
| "some label about typo"                                    |
| <http://learningsparql.com/ns/humanResources#nosuper>      |
| "a good employee"                                          |
| <http://learningsparql.com/ns/humanResources#Uncreated>    |
| <http://learningsparql.com/ns/humanResources#missing>      |
| "some comment about randomtype"                            |
| "model"                                                    |
| <http://learningsparql.com/ns/humanResources#freestanding> |
| "some label about randomtype"                              |
| "some comment about missing"                               |
| <http://learningsparql.com/ns/humanResources#Another>      |
| <http://learningsparql.com/ns/humanResources#invalidtype>  |
| <http://learningsparql.com/ns/humanResources#typo>         |
| <http://learningsparql.com/ns/humanResources#randomtype>   |
| <http://learningsparql.com/ns/humanResources#Employee>     |
| rdfs:Classs                                                |
| rdf:Property                                               |
| <http://learningsparql.com/ns/humanResources#name>         |
--------------------------------------------------------------

Я не уверен, почему такие элементы, как rdf: свойство, «хороший работник», sch: Text, et c. возвращаются как субъекты, когда они не являются субъектами в графе данных.

Почему они?

Очевидно, это как-то связано с тем, как SPARQL обрабатывает пути свойств, которые я пока не понимаю .

1 Ответ

2 голосов
/ 22 апреля 2020

Вы используете путь свойства с подстановочным знаком ноль или более ('*'). Фактически, шаблон ?s rdf:type* ?o означает «каждое значение ?s, связанное через ноль или более отношений типа с любым значением ?o».

Каждое значение , которое появляется на вашем графике (фактически каждое значение на любом графике), соответствует этому, потому что каждое значение имеет как минимум нулевые отношения типа. Следовательно, возвращается значение типа "some comment about typo", поскольку, хотя оно никогда не встречается в ваших данных как субъект, верно, что это значение имеет нулевые отношения типа к чему-то другому.

...