SPARQL: как передать свойства owl: эквивалента класса в свойства rdfs: subClassOf (owl: Restriction)? - PullRequest
0 голосов
/ 11 сентября 2018

Мой вопрос об использовании SPARQL для запроса некоторой онтологии совы, где интенсивно используется owl:Restrictions (в моем случае это " Cell Ontology ").

Вот пример некоторой типичной записи (в формате Turtle, извлеченной из вышеупомянутой онтологии):

###  http://purl.obolibrary.org/obo/CL_0000792
obo:CL_0000792 rdf:type owl:Class ;
           owl:equivalentClass [ owl:intersectionOf ( obo:CL_0000624
                                                      [ rdf:type owl:Restriction ;
                                                        owl:onProperty obo:RO_0002104 ;
                                                        owl:someValuesFrom obo:PR_000001380
                                                      ]
                                                      [ rdf:type owl:Restriction ;
                                                        owl:onProperty obo:RO_0002215 ;
                                                        owl:someValuesFrom obo:GO_0050777
                                                      ]
                                                      [ rdf:type owl:Restriction ;
                                                        owl:onProperty <http://purl.obolibrary.org/obo/cl#has_low_plasma_membrane_amount> ;
                                                        owl:someValuesFrom obo:PR_000001869
                                                      ]
                                                    ) ;
                                 rdf:type owl:Class
                               ] ;
           rdfs:subClassOf obo:CL_0000624 ,
                           obo:CL_0000815 ,
                           [ rdf:type owl:Restriction ;
                             owl:onProperty obo:RO_0002104 ;
                             owl:someValuesFrom obo:PR_000001380
                           ] ,
                           [ rdf:type owl:Restriction ;
                             owl:onProperty obo:RO_0002215 ;
                             owl:someValuesFrom obo:GO_0050777
                           ] ,
                           [ rdf:type owl:Restriction ;
                             owl:onProperty <http://purl.obolibrary.org/obo/cl#has_low_plasma_membrane_amount> ;
                             owl:someValuesFrom obo:PR_000001869
                           ] .

Здесь моя конечная цель - передать эквивалентные свойства совы в subClassOf properties:

CL_0000792 rdfs:subClassOf [
     rdf:type owl:Restriction ;
              owl:onProperty obo:RO_0002104 ;
              owl:someValueFrom obo:PR_000001380
 ] ;
 rdfs:subClassOf [
     rdf:type owl:Restriction ;
              owl:onProperty obo:cl#has_low_plasma_membrane_amount ;
              owl:someValueFrom obo:PR_000001869
 ] .

Чего я не добиваюсь - это получить все три свойства из части rdfs:subclass и затем правильно связать их с типами свойств subClassOf (затем отфильтровать obo:RO_0002215было бы легко).

РЕДАКТИРОВАТЬ: Поскольку я добился определенного прогресса, новый запрос SPARQL

EDIT2: после ответа Дамьяна Огнянова обновил часть запроса SPARQL, котораяигнорировал коллекцию в части owl: intersectionOf, которая также более компактна / элегантна

Здесь мой текущий запрос SPARQL:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX obo: <http://purl.obolibrary.org/obo/>
PREFIX tpo: <http://www.definiens.com/ontologies/TissuePhenomicsOntology>
PREFIX cl: <http://purl.obolibrary.org/obo/cl.owl>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX efo: <http://www.ebi.ac.uk/efo/efo.owl>

CONSTRUCT {
    ?cell rdfs:subClassOf [ rdf:type owl:Restriction ;
                            owl:onProperty ?cellProp ;
                            owl:someValuesFrom ?cellPropValue
                            ] .
    ?cellProp ?cellPropProp ?cellPropObj .
    ?cellPropValue ?cellPropValueProp ?cellPropValuePropValue .
    ?cell ?cellProp2 ?cellProp2Obj .
}

FROM named cl:
FROM named tpo:
WHERE {
    # query cl to get our information
    graph cl:
    {   
       ?cell (rdfs:subClassOf|(owl:equivalentClass/owl:intersectionOf/rdf:rest*/rdf:first)) ?x .
       ?x owl:onProperty ?cellProp ;
          owl:someValuesFrom ?cellPropValue .

        ?cellProp ?cellPropProp ?cellPropObj . 
        ?cellPropValue ?cellPropValueProp ?cellPropValuePropValue .
        ?cell ?cellProp2 ?cellProp2Obj .
    }

    # limit ?cell to the entries already present in TPO
    graph tpo:
    {
        ?cell rdfs:subClassOf* obo:CL_0000000 .
    }
}    

Если вы замените часть CONSTRUCT наSELECT * тогда кажется, что все переменные назначены правильно, информация есть.

То, чего я до сих пор упускаю, - это правильная CONSTRUCT часть для восстановления «несколько запутанного» ограничения owl:Property.Таким образом, этот запрос в основном возвращает длинный список пустых узлов, которые, например, не будут правильно анализироваться Protege.

@ AKSW также справедливо указал, что SPARQL может не быть инструментом выбора для запроса и конструирования.OWL-графики.Здесь действительно ясно видно, что для построения рабочего запроса нужно знать точную структуру данных, по крайней мере, таким образом.

? Cell (rdfs: subClassOf | (owl: эквивалент-класс / owl: intersectionOf /)rdf: отдых * / rdf: первый))? x.? x owl: onProperty? cellProp;owl: someValuesFrom? cellPropValue.

? cellProp? cellPropProp? cellPropObj.cellPropValue cellPropValueProp cellPropValuePropValue.«cell» cellProp2 «cellProp2Obj.

1 Ответ

0 голосов
/ 12 сентября 2018

Значение owl:intersectionOf является списком RDF, и приведенный выше фрагмент Turtle использует синтаксис списка RDF для перечисления членов коллекции owl:intersectionOf (например, записи заключены в интервалы между ( и )).

Итак, вы также должны включить rdf:rest*/rdf:first свойства в ваши пути свойств, так как они используются для создания коллекции.

Для запроса я введу дополнительную переменную, где нужно связатьограничение интереса и использование его для извлечения значений owl:onProperty и owl:someValuesFrom, например, ваше предложение WHERE может выглядеть примерно так:

?cell (rdfs:subClassOf|(owl:equivalentClass/owl:intersectionOf/rdf:rest*/rdf:first)) ?x .
?x owl:onProperty ?cellProp ;
   owl:someValuesFrom ?cellPropValue .

?cellProp ?cellPropProp ?cellPropObj . 
?cellPropValue ?cellPropValueProp ?cellPropValuePropValue .
?cell ?cellProp2 ?cellProp2Obj .
...