gpt4 book ai didi

java - 如何验证 OWLDataRange 对象是否包含指定值?

转载 作者:太空宇宙 更新时间:2023-11-04 12:16:26 25 4
gpt4 key购买 nike

我在 Protege 4.3.0 中创建了一个本体并存储在 OWL 文件中。该本体的一些数据属性的范围定义如下:

({"absent"} or {"value1" , "value2" , "value3"})

我会搜索在其范围内可能具有指定值的数据属性,因此我编写了以下代码示例,但我不知道如何查询 OWLDataRange 对象以查看它是否包含指定值(例如字符串 "value1")。

final OWLOntologyManager manager = OWLManager.createOWLOntologyManager();
final OWLOntology ontology = manager.loadOntologyFromOntologyDocument(file);
final OWLReasonerFactory rf = new StructuralReasonerFactory();
final OWLReasoner reasoner = rf.createReasoner(ontology);

// ...

// iterate over all data properties
for (OWLDataProperty topDataProperty : reasoner.getTopDataPropertyNode()) {
for(OWLDataProperty property: reasoner.getSubDataProperties(topDataProperty, false).getFlattened()) {

// iterate over all data ranges for the current data property
for (OWLDataRange dataRange : property.getRanges(ontology)) {

// I would check if the current data property contains a specified value in their ranges.
// ...

}
}
}

最佳答案

我对此类问题的解决方案是使用推理器 ( This Pellet fork )。

这个想法是创建一个类来表示“具有要检查范围的数据属性的个人”,并创建另一个类来表示“具有精确属性/文字的个人”。然后使用推理器检查这两个类的交集是否非空。

因为有一些技巧可以让它正常工作,这是我的完整解决方案:

import java.util.function.BiFunction;
import org.semanticweb.owlapi.model.*;
import openllet.owlapi.*;

public class RangeInclusionTest
{
public static void main(final String[] args)
{
try (final OWLManagerGroup group = new OWLManagerGroup())
{
final OWLOntologyID ontId = OWLHelper.getVersion(IRI.create("http://test.org#entail-class-restrict-to-some-range"), 1.0);
final OWLHelper owl = new OWLGenericTools(group, ontId, true);

// This declaration is vital since this reasoner have problems with pure anonymous reasoning.
// You can remove this property after yours tests, (or better use one of your already existing properties).
final OWLDataProperty prop = OWL.DataProperty("http://test.org#dummyProp");
owl.addAxiom(OWL.declaration(prop));

final OWLLiteral un = OWL.constant(1);
final OWLLiteral deux = OWL.constant(2);
final OWLLiteral trois = OWL.constant(3);
final OWLLiteral quatre = OWL.constant(4);
final OWLDataRange dataRange = OWL.dataOr(OWL.oneOf(un), OWL.oneOf(deux), OWL.oneOf(trois));

final BiFunction<OWLDataRange, OWLLiteral, Boolean> isIncludeInRange = //
(range, literal) -> owl.getReasoner().isSatisfiable(//
OWL.and(// You must be of all the following class
OWL.some(prop, OWL.oneOf(literal)), // The class of the 'literal'
OWL.some(prop, range), // The class of the range.
OWL.max(prop, 1))// But you can have the property only once.
);

System.out.println("[A] " + (isIncludeInRange.apply(dataRange, un)));
System.out.println("[B] " + (isIncludeInRange.apply(dataRange, deux)));
System.out.println("[C] " + (isIncludeInRange.apply(dataRange, trois)));
System.out.println("[D] " + (isIncludeInRange.apply(dataRange, quatre)));

} catch (final Exception e)
{
e.printStackTrace();
}
}
}

首先您必须定义您的范围。然后使用推理器的“isSatisfiable”方法。一种技巧是通过在交集类上添加限制“OWL.max(prop, 1)”来强制仅使用该属性的一个实例。

输出必须是

[A] true
[B] true
[C] true
[D] false

因为文字“quatre”不包含“dataRange”,所以答案“[D]”为假。正如您所看到的,该解决方案可以轻松地允许测试将某个范围包含在另一个范围中。

不需要对本体进行更改的解决方案可能是创建一个特殊的 swrl 规则并检查本体(甚至是空)是否包含该规则,但目前 dl-reasoner 不支持 swrl 上的包含。

关于java - 如何验证 OWLDataRange 对象是否包含指定值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39373392/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com