Мой вопрос об использовании 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.