3

我对 DBPedia 很陌生,我不知道如何以及从哪里开始。我对此进行了一些研究,据我了解,我们可以使用 SPARQL 查询语言(Apache Jena)访问数据。所以我开始下载Ontology Infobox Properties的 .ttl 文件。之后我提取了这个文件,它几乎有 2GB。我的问题从这里开始没有一个编辑器无法打开这个文件。我访问此文件的示例程序在这里...

public class OntologyExample {
public static void main(String[] args) {
    FileManager.get().addLocatorClassLoader(
            OntologyExample.class.getClassLoader());
    Model model = FileManager
            .get()
            .loadModel("D:\\Dell XPS\\DBPEDIA\\instance_types_en.ttl\\instance_types_en.ttl");


    String q = "SELECT * WHERE { "
            + "?e <http://dbpedia.org/ontology/series> <http://dbpedia.org/resource/The_Sopranos>  ."
            + "?e <http://dbpedia.org/ontology/releaseDate> ?date"
            + "?e <http://dbpedia.org/ontology/episodeNumber>  ?number   "
            + "?e <http://dbpedia.org/ontology/seasonNumber>   ?season"
            + " }" + "ORDER BY DESC(?date)";

    Query query = QueryFactory.create(q);
    QueryExecution queryExecution = QueryExecutionFactory.create(query,
            model);
    ResultSet resultSet = queryExecution.execSelect();
    ResultSetFormatter.out(System.out, resultSet, query);
    queryExecution.close();
}
}

所以这个程序的输入是那个 2GB 的文件。所以我只是运行了这个示例程序,它抛出了异常,比如

Exception in thread "main" com.hp.hpl.jena.n3.turtle.TurtleParseException: GC overhead limit exceeded
at com.hp.hpl.jena.n3.turtle.ParserTurtle.parse(ParserTurtle.java:63)
at com.hp.hpl.jena.n3.turtle.TurtleReader.readWorker(TurtleReader.java:33)
at com.hp.hpl.jena.n3.JenaReaderBase.readImpl(JenaReaderBase.java:119)
at com.hp.hpl.jena.n3.JenaReaderBase.read(JenaReaderBase.java:84)
at com.hp.hpl.jena.rdf.model.impl.ModelCom.read(ModelCom.java:268)
at com.hp.hpl.jena.util.FileManager.readModelWorker(FileManager.java:403)
at com.hp.hpl.jena.util.FileManager.loadModelWorker(FileManager.java:306)
at com.hp.hpl.jena.util.FileManager.loadModel(FileManager.java:258)
at jena.tutorial.OntologyExample.main(OntologyExample.java:18)

Caused by: java.lang.OutOfMemoryError: GC overhead limit exceeded
at java.util.Arrays.copyOfRange(Unknown Source)
at java.lang.String.<init>(Unknown Source)
at org.apache.jena.iri.impl.LexerPath.yytext(LexerPath.java:420)
at org.apache.jena.iri.impl.AbsLexer.rule(AbsLexer.java:81)
at org.apache.jena.iri.impl.LexerPath.yylex(LexerPath.java:711)
at org.apache.jena.iri.impl.AbsLexer.analyse(AbsLexer.java:52)
at org.apache.jena.iri.impl.Parser.<init>(Parser.java:108)
at org.apache.jena.iri.impl.IRIImpl.<init>(IRIImpl.java:65)
at org.apache.jena.iri.impl.AbsIRIImpl.create(AbsIRIImpl.java:692)
at org.apache.jena.iri.IRI.resolve(IRI.java:432)
at com.hp.hpl.jena.n3.IRIResolver.resolve(IRIResolver.java:167)
at com.hp.hpl.jena.n3.turtle.ParserBase._resolveIRI(ParserBase.java:198)
at com.hp.hpl.jena.n3.turtle.ParserBase.resolveIRI(ParserBase.java:192)
at com.hp.hpl.jena.n3.turtle.ParserBase.resolveQuotedIRI(ParserBase.java:183)
at com.hp.hpl.jena.n3.turtle.parser.TurtleParser.IRI_REF(TurtleParser.java:737)
at com.hp.hpl.jena.n3.turtle.parser.TurtleParser.IRIref(TurtleParser.java:680)
at com.hp.hpl.jena.n3.turtle.parser.TurtleParser.GraphTerm(TurtleParser.java:496)
at com.hp.hpl.jena.n3.turtle.parser.TurtleParser.VarOrTerm(TurtleParser.java:420)
at com.hp.hpl.jena.n3.turtle.parser.TurtleParser.TriplesSameSubject(TurtleParser.java:150)
at com.hp.hpl.jena.n3.turtle.parser.TurtleParser.Statement(TurtleParser.java:97)
at com.hp.hpl.jena.n3.turtle.parser.TurtleParser.parse(TurtleParser.java:67)
at com.hp.hpl.jena.n3.turtle.ParserTurtle.parse(ParserTurtle.java:49)
... 8 more

我正在从我的 Eclipse 运行此代码,这里是我的 Eclipse .ini 首选项。

org.eclipse.epp.package.jee.product
--launcher.defaultAction
openFile
--launcher.XXMaxPermSize
512M
-showsplash
org.eclipse.platform
--launcher.XXMaxPermSize
512m
--launcher.defaultAction
openFile
-vmargs
-Dosgi.requiredJavaVersion=1.5
-Xms1024m
-Xmx2048m

所以我的问题是

  1. 我怎样才能访问这种大文件。
  2. 如何以正确的方式使用 DBPedia。

所以请帮助我,我被困在这里。我正在做一个关于 DBpedia 的项目。

4

2 回答 2

5

您可以使用 Jena 的 ARQ 对 DBpedia 数据运行 SPARQL 查询,如果您要进行大量查询和数据处理,下载数据并在本地使用它很有用。要做到这一点,特别是对于像 DBpedia 这样大的数据,您可能不应该尝试将其加载到内存模型中,而是使用 TDB 和 Fuseki 来设置可以运行查询的 SPARQL 端点。这已在此答案中针对不同的数据集进行了讨论。

但是,由于您才刚刚开始,使用公共 DBpedia SPARQL 端点可能要容易得多。在那里,您可以输入 SPARQL 查询并以各种格式检索结果。您问题中的查询格式有点错误,但很容易清理;清理和工作查询如下。

SELECT * WHERE {
    ?e <http://dbpedia.org/ontology/series> <http://dbpedia.org/resource/The_Sopranos>  .
    ?e <http://dbpedia.org/ontology/releaseDate> ?date .
    ?e <http://dbpedia.org/ontology/episodeNumber> ?number .
    ?e <http://dbpedia.org/ontology/seasonNumber> ?season .
}
ORDER BY DESC(?date)

SPARQL 结果

DBpedia wiki 实际上有一整页关于在线访问 DBpedia Accessing the DBpedia Data Set over the Web,这将使您了解如何访问数据。wiki 上的另一个页面,DBpedia 数据集将告诉您更多关于可用数据的信息。

于 2013-06-24T01:01:28.897 回答
3

我正在使用TDB,您还有一些易于使用且比 Eclipse 快得多的命令行工具。您可以从他们的下载页面下载最新版本。您可以使用tdbloader2.ttl文件加载到存储中,然后tdbquery也可以在命令行或 Eclipse 中使用它来查询它,就像现在一样:

Dataset dataset = TDBFactory.createDataset( "path" );
Query query = QueryFactory.create( "SELECT * WHERE { "
        + "?e <http://dbpedia.org/ontology/series> <http://dbpedia.org/resource/The_Sopranos>  ."
        + "?e <http://dbpedia.org/ontology/releaseDate> ?date ."
        + "?e <http://dbpedia.org/ontology/episodeNumber>  ?number  . "
        + "?e <http://dbpedia.org/ontology/seasonNumber>   ?season ."
        + " }" + "ORDER BY DESC(?date)" );
QueryExecution qexec = QueryExecutionFactory.create( query, dataset );
ResultSet results = qexec.execSelect();

据我了解,您应该.在每个 SPARQL-triple 之后制作一个,只有最后一个是可选的。可能是命令行工具用完了堆空间。只需使用文本编辑器打开tdbloader2或应用程序并将标签更改为您喜欢的大小,例如:tdbquery-Xmx

JVM_ARGS=${JVM_ARGS:--Xmx4096M}

还要确保JENAROOT按照链接中的说明进行设置。

于 2013-07-02T17:50:26.983 回答