【问题标题】:How to set data type for OWL restriction using Apache Jena?如何使用 Apache Jena 设置 OWL 限制的数据类型?
【发布时间】:2016-10-07 22:54:15
【问题描述】:

我正在使用 Apache Jena。我已经创建了 data 属性,它的范围为 xsd:string 和作为超类添加到特定(已创建)类的限制:

DatatypeProperty dataProperty = model.createDatatypeProperty(baseURI + possibleProperty);
dataProperty.setRange(XSD.xstring);
MaxCardinalityRestriction restriction = model.createMaxCardinalityRestriction(null, dataProperty, 1);
itemClass.addSuperClass(restriction);

当我在 Protege 中打开生成的本体时,提到的限制如下所示:

DataProperty_Name max 1 Literal

我的目标是使用包含的数据类型(在数据属性的范围内指定)来获取它,例如我期待:

DataProperty_Name max 1 string

使用本体的应用程序需要知道限制的数据类型。您是否知道我需要在代码中更改哪些内容才能在限制中获取数据类型(例如字符串)而不是文字?

谢谢, 达科

【问题讨论】:

  • OWL 最大基数不是您已经认识到的数据类型的限制。您所追求的是 OWL 数据范围,特别是 FacetRestriction: w3.org/TR/owl2-syntax/#Data_Ranges 。请注意,OWL 2 的 Ontology API 并不完整(至少我几年前读到的内容是这样的)。我可以看到一个接口DataRange,但它只支持OneOf:jena.apache.org/documentation/javadoc/jena/org/apache/jena/…
  • 我想,你应该在 Jena 邮件列表上问这个,也许还有对 min、max 等的支持。
  • 谢谢,我也会尝试在耶拿邮件列表上得到答案。

标签: java jena owl restriction apache-jena


【解决方案1】:

正如建议的那样,我在 Jena 邮件列表上提出了问题,并得到了 Jena 不支持定义 DataRange 的 OWL 2 的答案。 这只是意味着没有便利功能,但您仍然可以通过在 RDF 级别工作来实现所需的效果,这只是冗长。查看 OWL 2 规范,了解需要哪些 RDF 三元组来表示所需的 DataRange,然后使用通用模型 API 来断言这些三元组。

我遵循了这个建议并成功地使用以下代码解决了我的问题:

MaxCardinalityRestriction restriction = model.createMaxCardinalityRestriction(null, existingDataProperty, 1);                                               
restriction.removeAll(OWL.cardinality);
restriction.addLiteral(OWL2.maxQualifiedCardinality, 1);
restriction.addProperty(OWL2.onDataRange, XSD.xstring);
itemClass.addSuperClass(restriction); 

谢谢, 达科

【讨论】:

  • 好的,那我误解了你的问题,抱歉。我以为您想对数据类型添加限制,例如int[>500]string[length>5]。这是 Jena Ontology 层无法做到的。正如你已经发现的那样,你的任务确实有效。
【解决方案2】:

您可以查看ONT-API 项目。 org.apache.jena.ontology.OntModel - com.github.owlcs.ontapi.jena.model.OntModel 有一个类比 - 但对于 OWL2 规范(原生 Jena 模式适用于 OWL1)。

例子:

    String uri = "https://stackoverflow.com/questions/39926809";
    String ns = uri + "#";
    OntModel m = OntManagers.createONT().createGraphModel(uri)
            .setNsPrefixes(OntModelFactory.STANDARD)
            .setNsPrefix("test", ns);

    OntDataProperty prop = m.createDataProperty(ns + "prop").addRange(XSD.xstring);
    OntDataRange dt = prop.ranges().findFirst().orElseThrow(AssertionError::new);
    m.createOntClass(ns + "clazz")
            .addSuperClass(m.createDataMaxCardinality(prop, 1, dt));
    m.write(System.out, "ttl");

输出:

@prefix test:  <https://stackoverflow.com/questions/39926809#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix owl:   <http://www.w3.org/2002/07/owl#> .
@prefix xsd:   <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .

<https://stackoverflow.com/questions/39926809>
        a       owl:Ontology .

test:prop  a        owl:DatatypeProperty ;
        rdfs:range  xsd:string .

test:clazz  a            owl:Class ;
        rdfs:subClassOf  [ a                            owl:Restriction ;
                           owl:maxQualifiedCardinality  "1"^^xsd:nonNegativeInteger ;
                           owl:onDataRange              xsd:string ;
                           owl:onProperty               test:prop
                         ] .

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多