私は異なる情報源から来た 2 人の同一人物を結び付けようとしています。私の考えでは、IndividualA に欠落しているプロパティ P がありますが、OWL.sameAs を使用して既存の P を持つ IndividualB に関連付けられている場合、推論器は IndividualA に P があることを出力する必要があります。なぜこれが機能しないのか混乱しています。これは私のコードです。
public class Main {
static String NS_A = "http://www.namespacea.com/ontoa.owl#";
static String NS_B = "http://www.namespaceb.com/ontob.owl#";
static String NS_C = "http://www.namespacec.com/ontoc.owl#";
public static void main(String[] args) {
OntModelSpec spec = OntModelSpec.OWL_MEM_MINI_RULE_INF;
OntModel modelA = ModelFactory.createOntologyModel(spec);
OntModel modelB = ModelFactory.createOntologyModel(spec);
OntModel modelC = ModelFactory.createOntologyModel(spec);
// Populate Model A
OntClass animal = modelA.createClass(NS_A + "Animal");
OntProperty hasFeathers = modelA.createOntProperty(NS_A + "hasFeathers");
hasFeathers.addDomain(animal);
hasFeathers.addRange(XSD.xboolean);
// Populate Model B
OntClass duck = modelB.createClass(NS_B + "Duck");
duck.setSuperClass(animal);
Individual donaldA = modelB.createIndividual(NS_B + "DonaldDuck", duck);
// NEXT LINE IS REMOVED ON PURPOSE
//donaldA.addLiteral(hasFeathers, true);
//Populate Model C
Individual donaldB = modelC.createIndividual(NS_C + "DonaldDuck", duck);
// Donald hasFeathers IS DECLARED HERE
donaldB.addLiteral(hasFeathers, true);
// THIS TIES UP THE TWO INDIVIDUALS
donaldA.addProperty(OWL.sameAs, donaldB);
// Query
System.out.println(
"Does " + donaldA.getLocalName() +
" have feathers? " + "Ans. " + donaldA.getPropertyValue(hasFeathers).asLiteral().getValue()
);
}
}
結果は NullPointerException です。この問題をどのように解決しますか?
私が考えたより難しいシナリオは、個人 A、B、C、D、および E が存在し、A は B と同じ、B は C と同じなどで、E は P = true である場合です。次に、A が P = true かどうかを尋ねると、TRUE と答えるべきです!