问题描述
我正在尝试针对2016 Wikidata dump (.ttl format)在本地运行“猫” Wikidata查询:
PREFIX bd: <http://www.bigdata.com/rdf#>
PREFIX wd: <http://www.wikidata.org/entity/>
PREFIX wdt: <http://www.wikidata.org/prop/direct/>
SELECT ?item
WHERE
{
?item wdt:P31 wd:Q146.
}
为此,我正在终端中运行sparql --data wikidata-20160201-all-BETA.ttl --query cats.rq
。
我有一个R5 3600X cpu和16GB RAM,并且该查询最终持续运行了几分钟,使用了70%的cpu和大约4GB的RAM。 Wikidata上的查询(目前的数据量比2016年高出几倍)在2秒内运行,同时仍使用SERVICE
来获取标签,而我不是。
我正在使用Apache Jena来运行SPARQL查询,并且我主要在Windows 10上进行了测试。 对于小型文件(例如Learning SPARQL中的文件),查询会立即返回正确的结果,因此Apache Jena似乎已配置好并且工作正常。但是,我是知识库/ Wikidata / SPARQL等方面的新手,所以也许我搞砸了。
编辑:大约20分钟后,我收到以下错误消息:
Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded
。
解决方法
sparql --data wikidata-20160201-all-BETA.ttl ...
将尝试在执行查询之前将整个文件加载到内存中。 wikidata-20160201-all-BETA.ttl
是大文件。
相反,将文件加载到TDB数据库中:
tdb2.tdbloader --loc WD wikidata-20160201-all-BETA.ttl
然后查询:
tdb2.tdbquery --loc WD --query cats.rq
它不适合存储在内存中,只需简单查找就可以加载所有内容。当您使用SERVICE
并询问WikiData端点时,您正在查询已经加载的数据库。
耶拿(Jena)中有一个远程SPARQL工具:rsparql
rsparql --service https://query.wikidata.org/bigdata/namespace/wdq/sparql --query cats.rq
这会将查询发送到给定的端点,并支持与sparql
相同的输出输出选项。