查询大型RDF数据集内存不足

时间:2013-06-09 02:18:10

标签: sparql semantic-web jena fuseki

我想在我的机器上下载两个或更多数据集,并且能够为每个数据集启动一个SPARQL端点。我尝试了Fuseki,这是Jena项目的一部分。但是,它会将整个数据集加载到内存中,如果我打算查询大型数据集(如DBpedia),我打算做其他事情(启动多个SPARQL端点并对它们使用联合查询系统),这是不太需要的。

为了让您了解一下,我打算使用SILK链接多个数据集,使用FEDX联合查询系统查询它们。如果你建议改变我正在使用的系统,或者可以给我一个提示,那就太好了。如果你建议一个适合这个项目的数据集,它也会很有帮助。

2 个答案:

答案 0 :(得分:4)

Jena的Fuseki可以使用TDB作为存储机制,TDB将内容存储在磁盘上。关于caching on 32 and 64 bit Java systems的TDB文档讨论了文件内容映射到内存的方式。我不相信TDB / Fuseki将整个数据集加载到内存中;这对于大型数据集来说是不可行的,但TDB可以处理相当大的数据集。我认为你应该考虑做的是使用tdbloader创建一个TDB商店;然后你可以指出Fuseki。

有一个在this answer中设置TDB商店的示例。在那里,查询是使用tdbquery执行的,但是根据文档的Running a Fuseki server部分,使用相同的TDB商店启动Fuseki所需要做的就是使用--loc=DIR选项:

  
      
  • --loc=DIR
    使用现有的TDB数据库。如果它不存在,请创建一个空的。
  •   

答案 1 :(得分:2)

As Joshua said,Jena的Fuseki使用TDB,因此它可以存储非常大的本体,而无需使用大量资源。例如,您可以将Yago2 taxonomy加载到其中,并仅使用大约600MB的RAM。您不需要将Fuseki加载到Java项目中,只需从命令行运行它并在项目中查询它即可。

通过以下方式将其加载到Windows命令行:

java -jar c:\your_ontology_directory\fuseki-server.jar \
  --file=your_ontology.rdf /your_namespace

然后,您可以使用任何GET / POST应用程序(甚至在您的浏览器中)对它运行SPARQL查询:

http://localhost:3030/your_namespace/sparql?query=SELECT * { ?s ?p ?o }

默认情况下,结果以XML格式返回。

<?xml version="1.0"?>
<sparql xmlns="http://www.w3.org/2005/sparql-results#">
  <head>
    <variable name="s"/>
    <variable name="p"/>
    <variable name="o"/>
  </head>
  <results>
    <result>
      <binding name="s">
        <uri>http://yago-knowledge/resource/wordnet_gulag_103467887</uri>
      </binding>
      <binding name="p">
        <uri>http://www.w3.org/2000/01/rdf-schema#subClassOf</uri>
      </binding>
      <binding name="o">
        <uri>http://yago-knowledge/resource/wordnet_prison_camp_104005912</uri>
      </binding>
    </result>
    …