SPARQL:如何将owl:equivalentClass转换为rdfs:subassof(owl:Restriction)属性?

SPARQL:如何将owl:equivalentClass转换为rdfs:subassof(owl:Restriction)属性?,sparql,owl,rdfs,Sparql,Owl,Rdfs,我的问题是使用SPARQL查询一些owl本体,其中大量使用了owl:Restrictions(在我的例子中,这是“” 以下是一些典型条目的示例(以Turtle格式,从上述本体中提取): 我没有做到的是从rdfs:subclass部分获取所有三个属性,然后将它们正确绑定到subassof类属性(然后过滤掉obo:RO_0002215会很容易) 编辑:我在这里取得了一些进展,一个新的SPARQL查询 EDIT2:Damyan Ognyanov的回答更新了SPARQL查询部分,该部分忽略了owl:in

我的问题是使用SPARQL查询一些owl本体,其中大量使用了
owl:Restrictions
(在我的例子中,这是“”

以下是一些典型条目的示例(以Turtle格式,从上述本体中提取):

我没有做到的是从
rdfs:subclass
部分获取所有三个属性,然后将它们正确绑定到
subassof
类属性(然后过滤掉
obo:RO_0002215
会很容易)

编辑:我在这里取得了一些进展,一个新的SPARQL查询

EDIT2:Damyan Ognyanov的回答更新了SPARQL查询部分,该部分忽略了owl:intersectionOf part中的集合,并且更加紧凑/优雅

下面是我当前的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 .
    }
}    
前缀rdfs:
前缀rdf:
前缀海外建筑运营管理局:
前缀tpo:
前缀cl:
前缀owl:
前缀efo:
构造{
?单元格rdf:子类[rdf:类型owl:限制;
owl:onProperty?cellProp;
猫头鹰:来自cellPropValue的一些值
] .
?cellProp?cellProp?cellPropObj。
?cellPropValue?cellPropValueProp?cellPropValuePropValue。
?cell?cellProp2?cellProp2Obj。
}
从命名cl:
来自命名tpo:
在哪里{
#查询cl以获取我们的信息
图cl:
{   
?单元格(rdf:子类|(owl:等价类/owl:相交/rdf:剩余*/rdf:第一))?x。
?x owl:onProperty?cellProp;
猫头鹰:来自cellPropValue的一些值。
?cellProp?cellProp?cellPropObj。
?cellPropValue?cellPropValueProp?cellPropValuePropValue。
?cell?cellProp2?cellProp2Obj。
}
#将?单元格限制为TPO中已存在的条目
图tpo:
{
?单元RDF:obo子类:CL_0000000。
}
}    
如果用
SELECT*
替换
CONSTRUCT
零件,则所有变量都已正确分配,信息就在那里

但是我仍然缺少一个适当的
构造
部分来重建“有些复杂的”
owl:Property
限制。因此,此查询主要返回一长串空白节点,例如Protege无法正确解析这些节点

@AKSW还正确地指出SPARQL可能不是查询和构造OWL图的首选工具。这里确实很清楚,人们需要知道精确的数据结构,以便至少以这种方式构建工作查询

?单元格(rdf:子类|(owl:等价类/owl:相交/rdf:剩余*/rdf:第一))?x。 ?x owl:onProperty?cellProp; 猫头鹰:来自cellPropValue的一些值

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

owl:intersectionOf的值是一个RDF列表,上面的代码片段使用RDF列表语法枚举
owl:intersectionOf
集合的成员(例如,条目被括在
之间)

因此,您还应该在属性路径中包含
rdf:rest*/rdf:first
属性,因为这些属性用于构造集合

对于查询,我将引入一个附加变量来绑定兴趣限制,并使用它从中获取
owl:onProperty
owl:somevalues的值,例如,您的
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 .

您在Protege中看到的垃圾是由SPARQL查询创建的非法/不完整的OWL构造。RDF解析器确实无法正确解析OWL构造。我不明白您的WHERE部分。我想,这个想法是要“拆分”owl:equivalentClass公理?但是您的WHERE部分正在寻找
rdfs:subassof
确实这很愚蠢,我被示例中两次出现的相同信息(以及原始数据中的一些其他情况)欺骗了。我只是试图用
owl:equivalentClass
谓词替换
rdfs:subassof
,但这失败了,显然是因为
owl:intersection
的缘故。原始查询和修改查询的失败(尽管我没有更新问题)让我确信,我遗漏了关于如何查询这些典型owl结构的部分逻辑。问题是SPARQL是为RDF而设计的,尽管owl结构有RDF映射,这些可能由任意嵌套的三元组表示,因此,如果事先不知道发生的OWL构造,几乎不可能通过SPARQL实现这一点。为什么不使用为OWL制作的API,例如OWL API。将需要大约10行代码。使用SPARQL,您可以尝试使用属性路径的通配符模式
(|!)
(属性路径中不允许使用变量),但我不确定这最终是否会有所帮助。实际上,问题中的查询没有检索
owl:intersectionOf
集合的成员。谢谢,我更新了问题中的查询!我仍然有一些问题需要构建一个有效的本体,但我怀疑这个问题是无关的(在某个点上创建了一个空白节点,但没有定义它,因此protege停止并返回一个错误)。
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 .
    }
}    
?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 .