Как подсчитать количество различных значений, их имена и количество появлений каждого свойства данных SPARQL

Я пытаюсь сделать запрос SPARQL, который возвращает количество различных значений каждого свойства данных файла Turtle. Я хотел бы знать, как называется каждое значение и сколько раз каждое повторялось. Я создал простую онтологию для тестирования:

@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix uni: <http://www.example.com/university#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@base <http://www.example.com/university> .

<http://www.example.com/university> rdf:type owl:Ontology .

#################################################################
#    Classes
#################################################################

###  http://www.example.com/university#Lecturer
:Lecturer rdf:type owl:Class ;
      rdfs:subClassOf :Person .


###  http://www.example.com/university#Person
:Person rdf:type owl:Class .


#################################################################
#    Individuals
#################################################################
###  http://www.example.com/university#Lecturer1
:Lecturer1 rdf:type owl:NamedIndividual ,
                   :Lecturer ;       
       :first_name "John"^^xsd:string ;
       :last_name "Coles"^^xsd:string ;
       :staffID "234"^^xsd:int .


  ###  http://www.example.com/university#Lecturer2
  :Lecturer2 rdf:type owl:NamedIndividual ,
                :Lecturer ;
       :first_name "John"^^xsd:string ;
       :last_name "Doe"^^xsd:string ;
       :staffID "89387"^^xsd:int .

     ###  http://www.example.com/university#lecturer3
     :lecturer3 rdf:type owl:NamedIndividual ,
                :Lecturer ;
       :first_name "John"^^xsd:string ;
       :last_name "Doe"^^xsd:string ;
       :staffID "7658"^^xsd:int .


  #################################################################
  #    General axioms
  #################################################################

  [ rdf:type owl:AllDisjointClasses ;
     owl:members (
            :Lecturer
          )
  ] .

И это запрос SPARQL, который я использую:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX uni: <http://www.example.com/university#>
select distinct ?ind ?property ?value (count(?value) as ?noOfDistinctValues) where {
   ?ind rdf:type uni:Lecturer .
   ?ind ?property ?value .
   ?property a owl:DatatypeProperty
}
group by ?ind ?property ?value

и вот результаты (количество не имеет для меня смысла), и я уверен, что с моим запросом что-то не так:

    ind        property     value     noOfDistinctValues
------------------------------------------------------------
  lecturer2    staffID      89387         6
  lecturer2    first_name   John          8
  lecturer2    last_name    Doe           8
  lecturer1    staffID      234           6
  lecturer1    first_name   John          8
  lecturer1    last_name    Coles         8
  lecturer3    staffID      7658          6
  lecturer3    first_name   John          8
  lecturer3    last_name    Doe           8

Что я ищу:

property     value     noOfDistinctValues 
------------------------------------------
staffID      89387         1               
first_name   John          3                
last_name    Doe           2                
staffID      234           1                
last_name    Coles         1                
staffID      7658          1                

Я даже не уверен, что считается, что его возвращают. Я также новичок в Ontology и SPARQL.

Я очень ценю вашу помощь


person DjSh    schedule 17.01.2020    source источник
comment
Сначала удалите ?ind и ?value из group by и select.   -  person Stanislav Kralin    schedule 18.01.2020
comment
Если я уберу ?value, числа будут еще более запутанными, и мне нужно посмотреть, что это за значения. Я мог бы удалить?   -  person DjSh    schedule 18.01.2020
comment
ваш вопрос немного вводит в заблуждение ... вам нужно количество вхождений каждого значения для каждого свойства? Или общее количество различных значений для каждого свойства? Оба явно разные вещи. Вам нужны подзапросы   -  person UninformedUser    schedule 18.01.2020
comment
Например, чтобы получить количество вхождений каждого свойства для каждого значения, вы должны, конечно, подсчитать ?ind: select ?property ?value (count(?ind) as ?noOfValueOccurrences) where { ?ind rdf:type uni:Lecturer . ?ind ?property ?value . ?property a owl:DatatypeProperty } group by ?property ?value   -  person UninformedUser    schedule 18.01.2020
comment
количество различных значений для каждого свойства: select ?property (count(distinct ?value) as ?noOfTotalValuesForProperty) where { ?ind rdf:type uni:Lecturer . ?ind ?property ?value . ?property a owl:DatatypeProperty } group by ?property   -  person UninformedUser    schedule 18.01.2020
comment
вы должны совместить оба   -  person UninformedUser    schedule 18.01.2020
comment
@AKSW большое спасибо за вашу помощь. Таким образом, ваш первый запрос возвращает числа, которые неверны, например 86, 78,.. Ваш второй запрос возвращает количество различных значений для каждого свойства. Я хотел бы знать, как называются значения и сколько раз каждое из них повторялось. Вы были правы. Мой вопрос не был ясен. сейчас редактирую   -  person DjSh    schedule 18.01.2020
comment
извините, но мой первый запрос работает так, как ожидалось - я попробовал сейчас. Кстати, ваши данные недействительны, черепаха. @base потребуется использование <#Lecturer> и т. д. Когда вы используете :Lecture, вы должны определить @prefix : <...> . Кроме того, пространство имен uni: отличается данными и запросом. Но в любом случае мой запрос работает как положено. Вы должны скопировать и вставить его, я пробовал с Apache Jena из CLI   -  person UninformedUser    schedule 18.01.2020
comment
Давайте продолжим обсуждение в чате.   -  person DjSh    schedule 18.01.2020


Ответы (1)


Благодаря @AKSW я смог решить свою проблему. Это сработало:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX uni: <http://www.example.com/university#>
select ?property (str(?value) as ?valueLiteral) (str(count(distinct ?ind)) as 
   ?noOfValueOccurrences)
          where { ?ind rdf:type uni:Lecturer. 
                  ?ind  ?property ?value.
                  ?property a owl:DatatypeProperty .}
group by ?property ?value
order by ?property
person DjSh    schedule 30.01.2020