0

私は異なる情報源から来た 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 と答えるべきです!

4

1 に答える 1

0

わかりました、私はイエナのメーリングリストに同じ質問を投稿しました。更新イアンをありがとう。Dave Reynoldsによると、推論システムはモデル内で機能し、異なるモデル間では機能しません。

したがって、答えは、たとえばmodelAのみを使用して、すべての個人がその中に格納されるようにすることです。

于 2012-11-07T11:56:20.690 に答える