如何在给定的本体中获得没有定义的rdfs:range的数据类型属性

时间:2016-12-07 10:56:39

标签: sparql rdf owl ontology rdfs

我需要在给定的本体中通过SPARQL查询检查没有定义rdfs:range的数据类型属性。例如,在以下代码中,我要查找的结果为dataproperty2

ont:Class1  a  owl:Class .
ont:Class2  a  owl:Class .

ont:dataProperty1  a  owl:DatatypeProperty ;
rdfs:domain  ont:Class1 ;
rdfs:label   "dataProperty1"@en ;
rdfs:range   xsd:string .

ont:dataProperty2  a  owl:DatatypeProperty ;
rdfs:domain  ont:Class2 ;
rdfs:label   "dataProperty2"@en .

我已经定义了这个SPARQL查询来检索与这个条件匹配的属性数,但由于它是一个聚合函数,即COUNT,我在获取数据类型属性时遇到问题,而不是数字,这不是有rdfs:范围定义。

SELECT ?return WHERE 
{
  {
  SELECT (COUNT(?p) as ?pCount)
    WHERE
    {
      ?p rdf:type owl:DatatypeProperty .
      ?p rdfs:range ?range .
    }
  }
  {
  SELECT DISTINCT (COUNT(?p) as ?prop)
    WHERE
    {
      ?p rdf:type owl:DatatypeProperty .
    }
  }
  BIND((?prop - ?pCount) as ?return) 
}

1 个答案:

答案 0 :(得分:4)

只需选择数据类型属性,然后过滤掉那些没有范围属性的属性:

select ?p where {
  ?p a owl:DatatypeProperty
  filter not exists {
    ?p rdfs:range ?range
  }
}