1

Jena Graph から個人の名前を抽出する際に問題に直面しています (一般的なルールの Reasoner を使用した RDF 推論モデルと OntSpec は RDFS_MEM_RDFS_INF です)。単純なケースかもしれませんが、これを行うための適切なチュートリアルをオンラインで見つけることができません (jena ルールの新機能)。この場合に呼び出す適切な API は何ですか?

infStmts = pModel.listStatements().filterKeep( new Filter<Statement>() {
        @Override
        public boolean accept(Statement o) {                
            boolean ex = false;
            Property prop1 = pModel.getProperty(prefix + "hasPropertyP1");
            String predicateName  = o.asTriple().getPredicate().getLocalName();             
            if(predicateName.equalsIgnoreCase(prop1.getLocalName()) )                   
                ex = true;                
            return ex;

        }
    });

    Statement s = infStmts.next();
    Statement st = ResourceFactory.createStatement(s.getSubject(), s.getPredicate(), s.getObject());
    System.out.println(st.getSubject().toString() + "****" + pModel.getRDFNode(st.getSubject().asNode()).as(Individual.class));
Exception in thread "Thread-37" com.hp.hpl.jena.ontology.ConversionException: Cannot convert node 4e62503a:14b01762f42:-7eea to Individual
at com.hp.hpl.jena.ontology.impl.IndividualImpl$1.wrap(IndividualImpl.java:61)
at com.hp.hpl.jena.enhanced.EnhNode.convertTo(EnhNode.java:152)
at com.hp.hpl.jena.enhanced.EnhNode.convertTo(EnhNode.java:31)
at com.hp.hpl.jena.enhanced.Polymorphic.asInternal(Polymorphic.java:62)
at com.hp.hpl.jena.enhanced.EnhNode.as(EnhNode.java:107)
...

Jena ルール ファイルには次のルールがあります。

[rule: ( :Subject1 :hasPropertyP2 :Object1) ->
       ( ?x rdf:type :Class1)
       ( ?x :hasPropertyP1 :Object2)]

個人の名前に関して ?x の値が必要です

4

1 に答える 1

3

次の行では、サブジェクトを取得してから、そのノード バージョンを取得してから、個別バージョンを取得しようとしています。

System.out.println(st.getSubject().toString() + "****" + pModel.getRDFNode(st.getSubject().asNode()).as(Individual.class));

グラフ内のすべてのトリプルのサブジェクトに対してこれを行っています。個人のドキュメントには次のように書かれています。

一般的な資源ではなく、個体として認識されるためには、既知のクラスを参照する少なくとも1つの rdf:type ステートメントがモデルに存在しなければなりません。

あなたが得ているエラーメッセージ、

ノード 4e62503a:14b01762f42:-7eea を個別に変換できません

グラフのどこかに、サブジェクトが空白ノードであるトリプルがあることを示します。どうやら、これらの空白のノードの 1 つが個人の基準を満たしていないようです。as(Individual.class)を実行する前に、ノードが個人になれるかどうかを確認する必要があります。最初にcanAs(Individual.class)で確認できます。

ただし、ルール ファイルにルールが 1 つしかないからといって、推論グラフ内のすべてのトリプルがそのルールによって生成されるわけではないことに注意する必要があります。推論グラフにはさらに多くのトリプルが存在する可能性があります。

あなたがやろうとしていることを行うためのより良い方法は、Model.listStatementsを使用して気になるプロパティを持つステートメントをリストし、サブジェクトが URI リソースであるかどうかを確認し、そうであればそれをURI リソースとその URI を抽出します。

Property p1 = model.createProperty(...)
StmtIterator stmts = model.listStatements(null,p1,null); 
while ( stmts.hasNext() ) {
  Statement stmt = stmts.next();
  RDFNode subject = stmt.getSubject();
  if ( subject.isURIResource() ) {
    System.out.println( "Subject URI is: "+ subject.asResource().getURI() );
  }
}
于 2015-01-20T00:35:38.527 に答える