0

Jena/SPARQL を使用していますが、ラベルからクラスを取得できません。

私は、すべてのクラスが異なる rdfs:label を持つオントロジーを使用しており、ラベルでリクエストを作成してモデルから URI または OntClass を取得しようとしています。

私は自分のコードを次のようにしました:

- - - -編集 - - - -

@ジョシュア:あなたのコードを試してみましたが、残念ながらまだ結果が得られません。変更したコードは次のとおりです。

        String labelOfTheClassIWant = "Quantity";

        String queryString = 
            "PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>"+
            "PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>" +
            "PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>" +
            "PREFIX owl: <http://www.w3.org/2002/07/owl#>" +
            "PREFIX dul: <"+RDF.getURI()+">" +

                "SELECT ?c" +
                "WHERE  { ?c rdfs:label '" + labelOfTheClassIWant + "' }";

        Query query = QueryFactory.create(queryString);

        QueryExecution qe = QueryExecutionFactory.create(query, model);
        ResultSet results = qe.execSelect();

        for ( ; results.hasNext() ; ){
            final QuerySolution solution = results.nextSolution();

            System.out.println( "the class I want to find :"+solution.get("c"));}

そして、上記のコードに必要なオントロジーからの数行を次に示します。

<owl:Class rdf:about="#Amount">
<rdfs:label xml:lang="en">Quantity</rdfs:label>

あなたのコードが機能している場合、私は本当に私の何が悪いのか理解できません:/コードを再確認して、愚かな間違いがないことを確認しますが、今のところそうは思いません.

4

1 に答える 1

0

問題全体が目の前にない場合 (データがない場合)、問題がどこにあるのかを正確に知ることは困難ですが、2 つのクラスを持つ小さなオントロジーを次に示します。それぞれにラベルがあります。

<rdf:RDF
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:owl="http://www.w3.org/2002/07/owl#"
    xmlns="http://example.org/labelled-classes#"
    xmlns:xsd="http://www.w3.org/2001/XMLSchema#"
    xmlns:rdfs="http://www.w3.org/2000/01/rdf-schema#">
  <owl:Ontology rdf:about="http://example.org/labelled-classes"/>
  <owl:Class rdf:about="http://example.org/labelled-classes#B">
    <rdfs:label>Class B</rdfs:label>
  </owl:Class>
  <owl:Class rdf:about="http://example.org/labelled-classes#A">
    <rdfs:label>Class A</rdfs:label>
  </owl:Class>
</rdf:RDF>

このクエリを実行すると

prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>

select ?class where { 
  ?class rdfs:label "Class A"
}

Jena のコマンド ライン ARQ を使用してデータに対して実行すると、次の結果が得られます。

$ arq --data labelled-classes.owl --query classByLabel.sparql
-------------------------------------------
| class                                   |
===========================================
| <http://example.org/labelled-classes#A> |
-------------------------------------------

したがって、クエリは問題ないように見えます。問題は、イエナで何をするかです。同じデータに対して同じクエリを実行する Java コードを次に示します。

import java.io.ByteArrayInputStream;

import com.hp.hpl.jena.query.QueryExecutionFactory;
import com.hp.hpl.jena.query.QuerySolution;
import com.hp.hpl.jena.query.ResultSet;
import com.hp.hpl.jena.rdf.model.Model;
import com.hp.hpl.jena.rdf.model.ModelFactory;

public class ClassByLabel {
    public static void main(String[] args) {
        final String rdfxmlContent = ""+
                "<rdf:RDF\n" +
                "    xmlns:rdf=\"http://www.w3.org/1999/02/22-rdf-syntax-ns#\"\n" +
                "    xmlns:owl=\"http://www.w3.org/2002/07/owl#\"\n" +
                "    xmlns=\"http://example.org/labelled-classes#\"\n" +
                "    xmlns:xsd=\"http://www.w3.org/2001/XMLSchema#\"\n" +
                "    xmlns:rdfs=\"http://www.w3.org/2000/01/rdf-schema#\">\n" +
                "  <owl:Ontology rdf:about=\"http://example.org/labelled-classes\"/>\n" +
                  "<owl:Class rdf:about=\"http://example.org/labelled-classes#B\">\n" +
                "    <rdfs:label>Class B</rdfs:label>\n" +
                "  </owl:Class>\n" +
                "  <owl:Class rdf:about=\"http://example.org/labelled-classes#A\">\n" +
                "    <rdfs:label>Class A</rdfs:label>\n" +
                "  </owl:Class>\n" +
                "</rdf:RDF>\n" +
                "";
        final String queryString = "" +
                "prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>\n" +
                "\n" +
                "select ?class where {\n" +
                "  ?class rdfs:label \"Class A\"\n" +
                "}\n" +
                "";

        final Model model = ModelFactory.createDefaultModel();
        model.read( new ByteArrayInputStream( rdfxmlContent.getBytes()), null, "RDF/XML" );

        final ResultSet results = QueryExecutionFactory.create( queryString, model ).execSelect();
        while ( results.hasNext() ) {
            final QuerySolution solution = results.nextSolution();
            System.out.println( "?class:\t"+solution.get( "class" ));
            System.out.println( "?o1:\t"+solution.get( "o1" ));
        }
    }
}

出力は次のとおりです。

?class: http://example.org/labelled-classes#A
?o1:    null

あなたのデータには奇妙なことがあるかもしれませんがo1c. バインドされていない変数を取得してもエラーは発生せず、単に が返されることに注意してくださいnull

于 2013-08-01T13:40:33.100 に答える