2017-07-19 43 views
1

我想創建一個簡單的本體,它有兩個類:class1和class2,以及兩個具有相同名稱的簡單文本數據屬性的實例(hasName:「string1」^^ xsd :string和hasName「string2」^^ xsd:string respectivly)。我想用推理器將這些實例分類到基於正則表達式的相應類(例如,對類1的限制將是hasName一些xsd:string [pattern「string1」],並且這樣,推理者應該推斷instance1屬於class1,但instance2不是)。如何做呢?在OWL類創建正則表達式限制

+0

您可以使用'xsd:pattern'的OWL facet限制作爲數據類型 – AKSW

+0

在曼徹斯特語法中:'class1 SubClassOf hasName some string [pattern'THE_PATTERN_HERE「] – AKSW

+1

但它取決於推理支持的確,您可以試試Pellet和HermiT--可能是REGEX模式中的一種。 – AKSW

回答

0

使用Openllet(2.6.2-SNAPSHOT)你可以做這樣的事情:

final OWLNamedIndividual x1 = OWL.Individual("#I1"); 
    final OWLNamedIndividual x2 = OWL.Individual("#I2"); 

    owl.addAxiom(OWL.equivalentClasses(ClsA, OWL.some(propB, OWL.restrict(XSD.STRING, OWL._factory.getOWLFacetRestriction(OWLFacet.PATTERN, OWL.constant("A.A")))))); 
    owl.addAxiom(OWL.propertyAssertion(x1, propB, OWL.constant("AAA"))); 
    owl.addAxiom(OWL.propertyAssertion(x2, propB, OWL.constant("BBB"))); 

    owl.addAxiom(OWL.differentFrom(x1, x2)); 

    final OpenlletReasoner r = owl.getReasoner(); 
    assertTrue(r.isEntailed(OWL.classAssertion(x1, ClsA))); 
    assertFalse(r.isEntailed(OWL.classAssertion(x2, ClsA))); 

正如你可以看到行:

OWL.restrict(XSD.STRING, OWL._factory.getOWLFacetRestriction(OWLFacet.PATTERN, OWL.constant("A.A")))))); 

是添加 「正則表達式」 的一個到分類算法。

這裏的模式是'A.A',模式遵循'java-regexp'enter link description here規則。