gpt4 book ai didi

java - 如何在owl类和java类之间进行高效快速的映射?

转载 作者:行者123 更新时间:2023-12-01 14:01:11 24 4
gpt4 key购买 nike

我正在尝试创建一个应用程序,利用 Hermit OWL 推理器对用户输入数据进行推理。我已经使用各种 OWLAPI 方法完成了从 OWL 类到 Java 类的映射以及其他方式的映射。

现在唯一要做的就是进行某种映射,允许 Java 程序自动将从本体中提取的大量 OWL 个体转换为关联的 Java 类。

目前我想到的是:一个 HashMap ,其中包含 OWL 类的名称列表作为键,然后将 Java 类的名称作为键的值。当查找键时,可以通过使用 Java Reflection 实例化该类。这种方式唯一的缺点是它可能会很慢?

有人有更好的主意来执行上述操作吗?

提前致谢!

汤姆 DC

编辑:

我转换为 Java 类的 OWL 类示例(该类太大,无法在此处发布):http://pastebin.com/aEsjvDN7

正如您在示例中所看到的,我已经尝试通过创建一个查看 OWL IRI 的函数来简化映射,然后决定它必须选择创建什么对象。当使用 JAXB 或 hashmap 时,此函数可能已过时且无用。

最佳答案

如果您需要从映射中的匹配项开始实例化特定的 Java 类,我会将这些类的值构建器放在这些类的值构建器中,而不是通过反射构建的类名,因为它为您提供了更好的灵 active 和可能更好的性能。

此类构建器的示例:

public interface BuilderClass<O, P>{
O build(P parameter);
}

public class BuilderSpecificClass<SpecificClass, Object>{
@Override
public SpecificClass build(Object parameter){
return new SpecificClass(parameter);
}
}

然后 map 看起来像这样:

Map<String, BuilderClass<SpecificClass, Object>> map=new HashMap<String, BuilderClass<SpecificClass, Object>>();
map.put("<class_iri>", new BuilderSpecificClass<SpecificClass, Object>());

也就是说,我不清楚你的具体类(class)是如何工作的,所以可能有更好的方法。您可以添加一个示例来说明如何构建它们吗?

在汤姆的额外详细信息之后编辑:

好的,如果我理解你的类在做什么,那么你已经实现了我描述的方法的一半。你的类基本上包装了 OWL 断言公理集,无论是断言的还是推断的 - 即,你的字段的值要么来自本体论,要么来自推理器,并将个体与个体或值联系起来。您还可以使用从本体和推理器填充类实例的方法;这些对应于我上面提出的 build() 方法,其中参数是本体和推理器。您可以跳过传递本体管理器,因为已经可以通过本体访问 OWLOntologyManager 的实例:ontology.getOWLOntologyManager()

我在这里要做的是创建与我描述的非常相似的构建器,并让它们调用您的方法来填充对象。

就性能而言,很难判断是否存在任何严重的热点 - 据猜测,这段代码中应该没有什么特别难的地方。本体是此类问题经常出现的地方。我在这门课中可以提出的建议如下:

private final String personURI = ThesisOntologyTools.PERSON_URI + "Person";

您有几个与此类似的成员变量。我相信这些是常量,因此您可以通过将它们设置为静态最终来节省内存,而不是在每个实例中都有一个副本。

OWLDataProperty isLocationConfirmed = dataFactory.getOWLDataProperty(IRI.create(isLocationConfirmedURI));

您正在以与此类似的方式创建许多对象。请注意,IRI.create() 将返回一个不可变的对象,以及 dataFactory.getOWLDataProperty(),因此您可以重用此类对象,而不是每次都访问数据工厂。数据工厂生成的所有对象都不链接到特定的本体并且是不可变的,因此您可以在类中自由地重用它们,以减少创建的新对象的数量。数据工厂可能会缓存其中一些数据,但其他一些数据可能会在每次调用时从头开始重新创建,因此减少调用次数应该会提高速度和内存需求。

除此之外,该方法看起来不错。如果所需的内存或速度太高(或太低),您可能需要开始使用分析器来查明问题。如果热点位于 OWL API 中,请提出问题 in OWLAPI issue tracker :-) 我们没有从真实用户那里获得足够的性能报告。

关于java - 如何在owl类和java类之间进行高效快速的映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19340486/

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