使用特定语言按标签检索DBpedia本体类?

时间:2014-06-24 09:29:36

标签: java jena owl ontology dbpedia

我有从http://wiki.dbpedia.org/Downloads39下载的DBPedia Ontology。 在这个本体论中,我有这种情况:

<owl:Class rdf:about="http://dbpedia.org/ontology/BasketballLeague">
        <rdfs:label xml:lang="el">Ομοσπονδία Καλαθοσφαίρισης</rdfs:label><rdfs:label xml:lang="fr">ligue de basketball</rdfs:label><rdfs:label xml:lang="en">basketball league</rdfs:label><rdfs:label xml:lang="it">lega di pallacanestro</rdfs:label><rdfs:label xml:lang="ja">バスケットボールリーグ</rdfs:label><rdfs:comment xml:lang="en">a group of sports teams that compete against each other in Basketball</rdfs:comment><rdfs:subClassOf rdf:resource="http://dbpedia.org/ontology/SportsLeague"/>
</owl:Class>

现在,我想使用Jena阅读这个本体并检索具有其对象的#ow;&#34; ligue de basketball&#34;用法语。在这种情况下,我不知道如何使用Jena库来设置法语。

从DBPedia Ontology,似乎xml:lang =&#34; fr&#34;是一个谓词,但我尝试过这段代码:

String inputFileName = "C:\\dbpedia_3.9.owl";
// Create an empty in-memory ontology model 
OntDocumentManager mgr = new OntDocumentManager();
OntModelSpec s = new OntModelSpec( OntModelSpec.RDFS_MEM );
s.setDocumentManager( mgr );
OntModel m = ModelFactory.createOntologyModel( s, null );
// use the FileManager to open the ontology from the filesystem
InputStream in = FileManager.get().open(inputFileName);
if (in == null) {
    throw new IllegalArgumentException( "File: " + inputFileName + " not found"); 
}
// read the ontology file
m.read( in, "" );

StmtIterator stmti = m.listStatements();
            while (stmti.hasNext()){
                Statement statement = stmti.nextStatement();
                System.out.println (statement.getPredicate());
            }

但我只得到:

  

http://www.w3.org/2000/01/rdf-schema#label

我无法获得谓词中语言的信息。为什么? 我如何检索这些信息和猫头鹰类?我在这里做错了什么?

1 个答案:

答案 0 :(得分:2)

您需要阅读RDF中的文字以及它们如何在RDF / XML中编码。您已经显示的本体片段是RDF / XML(其设计不是人类可读的),而xml:lang不是属性。 xml:lang属性用于指定具有语言标记的文字的语言。

  

2.7 Languages: xml:lang

     

RDF / XML允许使用2.12定义的xml:lang属性   XML 1.0 [XML]的语言识别允许识别   内容语言。 xml:lang属性可以在任何节点上使用   element或property元素,表示包含的内容   用给定的语言。包含XML文字的类型文字是   不受此属性的影响。最具体的范围内语言   present(如果有)应用于属性元素字符串文字内容   或属性属性值。 xml:lang =&#34;&#34;表格表示   没有语言标识符。

     

标记RDF属性的内容语言的一些示例是   如例8所示:

     

示例8:xml的完整示例:lang(example08.rdf输出example08.nt

     
<?xml version="1.0" encoding="utf-8"?>
<rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
         xmlns:dc="http://purl.org/dc/elements/1.1/">
  <rdf:Description rdf:about="http://www.w3.org/TR/rdf-syntax-grammar">
    <dc:title>RDF/XML Syntax Specification (Revised)</dc:title>
    <dc:title xml:lang="en">RDF/XML Syntax Specification (Revised)</dc:title>
    <dc:title xml:lang="en-US">RDF/XML Syntax Specification (Revised)</dc:title>
  </rdf:Description>

  <rdf:Description rdf:about="http://example.org/buecher/baum" xml:lang="de">
    <dc:title>Der Baum</dc:title>
    <dc:description>Das Buch ist außergewöhnlich</dc:description>
    <dc:title xml:lang="en">The Tree</dc:title>
  </rdf:Description>
</rdf:RDF>

如果您查看上面链接的example08.nt,您会看到三元组包括:

<http://www.w3.org/TR/rdf-syntax-grammar> <http://purl.org/dc/elements/1.1/title> "RDF/XML Syntax Specification (Revised)" .
<http://www.w3.org/TR/rdf-syntax-grammar> <http://purl.org/dc/elements/1.1/title> "RDF/XML Syntax Specification (Revised)"@en .
<http://www.w3.org/TR/rdf-syntax-grammar> <http://purl.org/dc/elements/1.1/title> "RDF/XML Syntax Specification (Revised)"@en-us .

<http://example.org/buecher/baum> <http://purl.org/dc/elements/1.1/title> "Der Baum"@de .
<http://example.org/buecher/baum> <http://purl.org/dc/elements/1.1/title> "The Tree"@en .

资源有多个属性dc:title的值。 xml:lang不是属性,但用于指定文字的一部分。

在DBpedia数据中也是如此。属性rdfs:label有多个值,RDF / XML序列化中的xml:lang属性用于表示其语言。目前我无法使用DBpedia,但如果您转到http://dbpedia.org/ontology/BasketballLeague并滚动到页面底部,您就可以下载各种格式的数据了。如果您以TTL / N3格式下载它,您会看到如下内容:

dbpedia-owl:BasketballLeague rdfs:label "basketball league"@en ,
                                        "Ομοσπονδία Καλαθοσφαίρισης""@el ,
                                        "ligue de basketball"@fr, 
                                        ... 

您需要使用getObject获取谓词的对象,无论它是否是带有isLiteral的literal,以及何时使用getLanguage获取语言标记(如果有)。相关类的Javadoc描述了您需要的所有方法。我已经链接到本段前面的文字类。