4

我找不到一些体面的简单代码示例,将 SWRL 和 Jena 与 Pellet 一起使用,或者至少使用 SWRL?我研究了 Pellet 文档中的一些示例,但没有关于使用 SWRL 的示例。网络上的大多数示例都不完整且令人困惑。

我找到的唯一解决方案是使用 Jess Rule Engine,但它不是免费的,并且是在商业许可下的。我发现 Pellet 支持 SWRL 规则,但找不到运行示例。

我发现的唯一例子是这个,但我不明白:

OWLOntologyManager m = create();
OWLOntology o = m.createOntology(example_iri);
// Get hold of references to class A and class B.
OWLClass clsA = df.getOWLClass( IRI.create(example_iri +    "#A" ));
OWLClass clsB = df.getOWLClass(IRI.create(example_iri +    "#B"    ));
SWRLVariable var = df.getSWRLVariable(IRI.create(example_iri + "#x" ));
SWRLClassAtom body = df.getSWRLClassAtom(clsA, var);
SWRLClassAtom head = df.getSWRLClassAtom(clsB, var);
SWRLRule rule = df.getSWRLRule(Collections.singleton(body),
Collections.singleton(head));
m.applyChange(new AddAxiom(o, rule));
4

2 回答 2

8

颗粒规则和耶拿规则非常不同™

简短的回答是 Pellet 支持 SWRL 规则。如果您有一个包含 SWRL 规则的本体并要求 Pellet 对其进行推理,它将考虑它们。

Jena 有自己的规则语言,在文档页面Reasoners and rule engine: Jena inference support中有描述。它支持正向和反向链接规则。

然而,尽管 Pellet 和 Jena 都支持规则的概念,但 SWRL 规则和 Jena 规则的预期域是非常不同的。SWRL 规则是 OWL 级别的结构;SWRL 规则中的一元谓词是类表达式,二元谓词是对象和数据属性。此外,SWRL 规则只匹配指定的个人;它们与仅推断存在的个人不匹配。另一方面,Jena 规则是 RDF 级别的,旨在处理 RDF 图。虽然 RDF 和 OWL 经常一起使用(例如,OWL 数据在 RDF 中被序列化),但两者在概念上是不同的。可以实现不使用 RDF 的 OWL 推理器,并且可以构建不使用 RDF 图的 SWRL 引擎。

Jena 还是 OWL API?

您显示的代码基于OWLOntologyManager的存在,基于 OWL API,而不是 Jena 的 API。OWL API 将具有更直接的功能来处理 OWL 和 SWRL 规则,而 Jena 不会。(Jena 的 OntModel 与 OWL1 配合得很好,但对 OWL2 的支持还不完整(并且仍然“对贡献者开放”)。

与使用 OWL API 或尝试使用 Jena 的 API 相比,您可能会发现使用 Protégé 等编辑器创建规则更容易。Martin Kuba 编写了一个非常好的OWL2 和 SWRL 教程,可以在这里为您提供帮助。

于 2013-06-28T12:31:47.747 回答
5

SWRL 规则适用于 Pellet API。我使用 Protégé 创建了本体和 SWRL 规则,并且能够使用 Java 代码动态创建 OWL 个体。整个本体aggregatedOwl在以下代码中使用。此代码加载本体(基础 OWL + 个体,如果有的话 + SWRL 规则)并在其上运行 Pellet 推理器并将推断结果保存在字符串中。

import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.io.StringDocumentTarget;
import org.semanticweb.owlapi.model.OWLAxiom;
import org.semanticweb.owlapi.model.OWLOntology;
import org.semanticweb.owlapi.model.OWLOntologyCreationException;
import org.semanticweb.owlapi.model.OWLOntologyManager;
import org.semanticweb.owlapi.model.OWLOntologyStorageException;
import org.semanticweb.owlapi.util.InferredAxiomGenerator;
import org.semanticweb.owlapi.util.InferredOntologyGenerator;
import org.semanticweb.owlapi.util.InferredPropertyAssertionGenerator;
import com.clarkparsia.pellet.owlapiv3.PelletReasoner;
import com.clarkparsia.pellet.owlapiv3.PelletReasonerFactory;

try {
    manager = OWLManager.createOWLOntologyManager();

    InputStream owlInputStream = new ByteArrayInputStream(aggregatedOwl.getBytes("UTF-8"));
    inferredOntology = manager.loadOntologyFromOntologyDocument(owlInputStream);

    PelletReasoner reasoner = PelletReasonerFactory.getInstance().createReasoner(inferredOntology);
    reasoner.getKB().realize();

    List<InferredAxiomGenerator<? extends OWLAxiom>> axiomGenerators = new ArrayList<InferredAxiomGenerator<? extends OWLAxiom>>();
    axiomGenerators.add( new InferredPropertyAssertionGenerator() );

    InferredOntologyGenerator iog = new InferredOntologyGenerator(reasoner,axiomGenerators);
    iog.fillOntology(manager, inferredOntology);

    // Save the new ontology
    OutputStream owlOutputStream = new ByteArrayOutputStream();
    manager.saveOntology(inferredOntology, owlOutputStream);
    inferredData = owlOutputStream.toString();
}
catch ( Exception e ) {
    throw new Exception("Exception occurred in applying reasoner");
}

希望这对你有帮助。

于 2013-07-03T05:36:07.753 回答