gpt4 book ai didi

java - 如何使用 owlapi 中内置的 swrl 与pellet 一起使用?

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

我尝试在java owl-api 中使用swrl 和pellet。我看过: owl2 and swrl tutorial test of builtin swrl in pelletswrl definition

我设法使用 swrl 进行简单的推理,例如:A(?x) -> B(?x)

但是当需要使用“内置”swrl 谓词(例如(等于、大于、小于等))时我陷入困境,我认为我的测试程序(可能在命名空间中)某个地方有问题,但我找不到哪里。

预期输出是:

<http://org.katk/Motifs#me> -> owl:Thing
<http://org.katk/Motifs#me> -> <http://org.katk/Motifs#A>
prop(me, 50)
A(?x) ← prop(?x, ?y) ⋀ equal(?y, 50)

但实际输出是:

<http://org.katk/Motifs#me> -> owl:Thing
prop(me, 50)
A(?x) ← prop(?x, ?y) ⋀ equal(?y, 50)

未找到 A 类。这是我的程序的代码:

package org.katk;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

import org.semanticweb.owlapi.apibinding.OWLManager;
import org.semanticweb.owlapi.io.OWLObjectRenderer;
import org.semanticweb.owlapi.model.IRI;
import org.semanticweb.owlapi.model.OWLAxiom;
import org.semanticweb.owlapi.model.OWLClass;
import org.semanticweb.owlapi.model.OWLDataFactory;
import org.semanticweb.owlapi.model.OWLDataPropertyExpression;
import org.semanticweb.owlapi.model.OWLLiteral;
import org.semanticweb.owlapi.model.OWLNamedIndividual;
import org.semanticweb.owlapi.model.OWLOntology;
import org.semanticweb.owlapi.model.OWLOntologyChange;
import org.semanticweb.owlapi.model.OWLOntologyCreationException;
import org.semanticweb.owlapi.model.OWLOntologyManager;
import org.semanticweb.owlapi.model.SWRLAtom;
import org.semanticweb.owlapi.model.SWRLVariable;
import org.semanticweb.owlapi.reasoner.NodeSet;
import uk.ac.manchester.cs.owlapi.dlsyntax.DLSyntaxObjectRenderer;

import com.clarkparsia.pellet.owlapiv3.PelletReasoner;
import com.clarkparsia.pellet.owlapiv3.PelletReasonerFactory;

public class Motifs {

public static <T> IRI iri(final Class<T> clazz, final String name) {
return IRI.create("http://" + clazz.getPackage().getName() + "/" + clazz.getSimpleName() + "#" + name);
}

final static IRI base = iri(Motifs.class, "ontology");
final OWLDataFactory factory;
final OWLOntology ontology;
final OWLOntologyManager manager;

public Motifs() throws OWLOntologyCreationException {
manager = OWLManager.createOWLOntologyManager();
factory = manager.getOWLDataFactory();
ontology = manager.createOntology(base);
}

public OWLNamedIndividual declareIndividual(final IRI iri)
{
final OWLNamedIndividual baby = factory.getOWLNamedIndividual(iri);
manager.addAxiom(ontology, factory.getOWLDeclarationAxiom(baby));
return baby;
}

public List<OWLOntologyChange> addAxiom(final OWLAxiom axiom)
{
return manager.addAxiom(ontology, axiom);
}

public void applyAll() {
final OWLClass clsA = factory.getOWLClass(iri(Motifs.class, "A"));

final OWLDataPropertyExpression prop = factory.getOWLDataProperty(iri(Motifs.class, "prop"));
final OWLDataPropertyExpression equal = factory.getOWLDataProperty(IRI.create("http://www.w3.org/2003/11/swrlb#equal"));

final SWRLVariable varX = factory.getSWRLVariable(iri(Motifs.class, "x"));
final SWRLVariable varY = factory.getSWRLVariable(iri(Motifs.class, "y"));
final OWLLiteral literal = factory.getOWLLiteral(50);
final OWLNamedIndividual ind = declareIndividual(iri(Motifs.class, "me"));
addAxiom(factory.getOWLDataPropertyAssertionAxiom(prop, ind, literal));

final Set<SWRLAtom> antecedent = new HashSet<>();
antecedent.add(factory.getSWRLDataPropertyAtom(prop, varX, varY));
antecedent.add(factory.getSWRLDataPropertyAtom(equal, varY, factory.getSWRLLiteralArgument(literal)));

final Set<SWRLAtom> consequences = new HashSet<>();
consequences.add(factory.getSWRLClassAtom(clsA, varX));

addAxiom(factory.getSWRLRule(antecedent, consequences));

final PelletReasoner pellet = PelletReasonerFactory.getInstance().createReasoner(ontology);
final NodeSet<OWLClass> x = pellet.getTypes(ind, false);
x.getNodes().forEach(node -> System.out.println(ind + " -> " + node.getRepresentativeElement()));

System.out.println("------------------------------------");
if (!pellet.isConsistent()) System.out.println("Ontology isn't consistent");
final OWLObjectRenderer renderer = new DLSyntaxObjectRenderer();
for (final OWLAxiom r : ontology.getAxioms())
System.out.println(renderer.render(r));
}

public static void main(String[] argv)
{
try
{
(new Motifs()).applyAll();
}
catch(final Exception e)
{
e.printStackTrace();
}
}
}

使用此运行测试程序:

groupId:net.sourceforge.owlapi, artifact:owlapi-distribution, version:3.4.10
groupId:com.github.ansell.pellet, artifcat:pellet-owlapiv3, version:2.3.6-ansell

有人可以帮我解决这个问题吗?

最佳答案

答案是:在 owl-api/pellet 实现中,必须使用特殊原子“getSWRLBuiltInAtom”来使用内置函数,就像下面对“applyAll()”方法的更正一样。该原子启用对内置 swrl 谓词的特殊评估行为。

public void applyAll() {
final OWLClass clsA = factory.getOWLClass(iri(Motifs.class, "A"));

final OWLDataPropertyExpression prop = factory.getOWLDataProperty(Utils.iri(Motifs.class, "prop"));
//final OWLDataPropertyExpression equal = factory.getOWLDataProperty(IRI.create("http://www.w3.org/2003/11/swrlb#equal"));

final SWRLVariable varX = factory.getSWRLVariable(iri(Motifs.class, "x"));
final SWRLVariable varY = factory.getSWRLVariable(iri(Motifs.class, "y"));
final OWLLiteral literal = factory.getOWLLiteral(50);
final OWLNamedIndividual ind = declareIndividual(iri(Motifs.class, "me"));
addAxiom(factory.getOWLDataPropertyAssertionAxiom(prop, ind, literal));

final Set<SWRLAtom> antecedent = new HashSet<>();
antecedent.add(factory.getSWRLDataPropertyAtom(prop, varX, varY));
// antecedent.add(factory.getSWRLDataPropertyAtom(equal, varY, factory.getSWRLLiteralArgument(literal)));
final List<SWRLDArgument> args = new ArrayList<>(2);
args.add(varY);
args.add(factory.getSWRLLiteralArgument(literal));
antecedent.add(factory.getSWRLBuiltInAtom(IRI.create("http://www.w3.org/2003/11/swrlb#equal"), args));

final Set<SWRLAtom> consequences = new HashSet<>();
consequences.add(factory.getSWRLClassAtom(clsA, varX));

addAxiom(factory.getSWRLRule(antecedent, consequences));

final PelletReasoner pellet = PelletReasonerFactory.getInstance().createReasoner(ontology);
final NodeSet<OWLClass> x = pellet.getTypes(ind, false);
x.getNodes().forEach(node -> System.out.println(ind + " -> " + node.getRepresentativeElement()));

System.out.println("------------------------------------");
if (!pellet.isConsistent()) System.out.println("Ontology isn't consistent");
final OWLObjectRenderer renderer = new DLSyntaxObjectRenderer();
for (final OWLAxiom r : ontology.getAxioms())
System.out.println(renderer.render(r));
}

关于java - 如何使用 owlapi 中内置的 swrl 与pellet 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31500701/

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