本地 Blazegraph 上的 Wikidata :此处预期有 RDF 值,发现“”[第 1 行]

2023-12-14

我们(Thomas 和 Wolfgang)已按照此处的说明在本地安装了 wikidata 和 blazegraph:https://github.com/wikimedia/wikidata-query-rdf/blob/master/docs/getting-started.md

The

mvn package command was successful

[INFO] ------------------------------------------------------------------------
[INFO] Reactor Summary:
[INFO] 
[INFO] parent ............................................. SUCCESS [ 54.103 s]
[INFO] Shared code ........................................ SUCCESS [ 23.085 s]
[INFO] Wikidata Query RDF Testing Tools ................... SUCCESS [ 11.698 s]
[INFO] Blazegraph extension to improve performance for Wikibase SUCCESS [02:12 min]
[INFO] Blazegraph Service Package ......................... SUCCESS [01:02 min]
[INFO] Wikidata Query RDF Tools ........................... SUCCESS [02:19 min]
[INFO] Wikibase RDF Query Service ......................... SUCCESS [ 25.466 s]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS

我们都在使用

java version "1.8.0_151"
Java(TM) SE Runtime Environment (build 1.8.0_151-b12)
Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)

我们都下载了latest-all.ttl.gz,例如

31064651574 Jan  3 19:30 latest-all.ttl.gz

from https://dumps.wikimedia.org/wikidatawiki/entities/花了大约4个小时。

.munge 在 data/split 中创建了 424 个名为“wikidump-000000001.ttl.gz”的文件

~/wikidata/wikidata-query-rdf/dist/target/service-0.3.0-SNAPSHOT$ ./munge.sh -f data/latest-all.ttl.gz -d data/split -l en,de 
#logback.classic pattern: %d{HH:mm:ss.SSS} [%thread] %-5level %logger{36} - %msg%n
08:23:02.391 [main] INFO  org.wikidata.query.rdf.tool.Munge - Switching to data/split/wikidump-000000001.ttl.gz
08:24:21.249 [main] INFO  org.wikidata.query.rdf.tool.Munge - Processed 10000 entities at (105, 47, 33)
08:25:07.369 [main] INFO  org.wikidata.query.rdf.tool.Munge - Processed 20000 entities at (162, 70, 41)
08:25:56.862 [main] INFO  org.wikidata.query.rdf.tool.Munge - Processed 30000 entities at (186, 91, 50)
08:26:43.594 [main] INFO  org.wikidata.query.rdf.tool.Munge - Processed 40000 entities at (203, 109, 59)
08:27:24.042 [main] INFO  org.wikidata.query.rdf.tool.Munge - Processed 50000 entities at (224, 126, 67)
08:28:00.770 [main] INFO  org.wikidata.query.rdf.tool.Munge - Processed 60000 entities at (244, 142, 75)
08:28:32.670 [main] INFO  org.wikidata.query.rdf.tool.Munge - Processed 70000 entities at (272, 161, 84)
08:29:12.529 [main] INFO  org.wikidata.query.rdf.tool.Munge - Processed 80000 entities at (261, 172, 91)
08:29:47.764 [main] INFO  org.wikidata.query.rdf.tool.Munge - Processed 90000 entities at (272, 184, 98)
08:30:20.254 [main] INFO  org.wikidata.query.rdf.tool.Munge - Processed 100000 entities at (286, 196, 105)
08:30:20.256 [main] INFO  org.wikidata.query.rdf.tool.Munge - Switching to data/split/wikidump-000000002.ttl.gz
08:30:55.058 [main] INFO  org.wikidata.query.rdf.tool.Munge - Processed 110000 entities at (286, 206, 112)

当 Thomas 尝试在 blazegraph 上加载一个文件时

./loadRestAPI.sh -n wdq -d data/split/wikidump-000000001.ttl.gz

他得到了下面的错误。尝试从 blazegraph 的 UPDATE 选项卡导入也不起作用。

可以采取什么措施来解决这个问题?

错误: uri=[文件:/home/tsc/projects/TestSPARQL/wikidata-query-rdf-0.2.1/dist/target/service-0.2.1/data/split/wikidump-000000001.ttl.gz],上下文uri =[] java.util.concurrent.ExecutionException: org.openrdf.rio.RDFParseException:此处需要 RDF 值,但已找到 '' [第 1 行] 在 java.util.concurrent.FutureTask.report(FutureTask.java:122) 在 java.util.concurrent.FutureTask.get(FutureTask.java:192) 在 com.bigdata.rdf.sail.webapp.BigdataServlet.submitApiTask(BigdataServlet.java:281) 在 com.bigdata.rdf.sail.webapp.InsertServlet.doPostWithURIs(InsertServlet.java:397) 在 com.bigdata.rdf.sail.webapp.InsertServlet.doPost(InsertServlet.java:116) 在 com.bigdata.rdf.sail.webapp.RESTServlet.doPost(RESTServlet.java:303) 在 com.bigdata.rdf.sail.webapp.MultiTenancyServlet.doPost(MultiTenancyServlet.java:192) 在 javax.servlet.http.HttpServlet.service(HttpServlet.java:707) 处 javax.servlet.http.HttpServlet.service(HttpServlet.java:790) 在 org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:808) 在 org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:587) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143) 在 org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:577) 在 org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:223) 在 org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1127) 在 org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:515) 在 org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:185) 在 org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1061) 在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141) 在 org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:215) 在 org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:110) 在 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97) 在 org.eclipse.jetty.server.Server.handle(Server.java:497) 处 org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310) 在 org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257) 在 org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540) 在 org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635) 在 org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555) 在 java.lang.Thread.run(Thread.java:748) 引起的: org.openrdf.rio.RDFParseException:此处需要 RDF 值,但已找到 '' [第 1 行] 在 org.openrdf.rio.helpers.RDFParserHelper.reportFatalError(RDFParserHelper.java:441) 在 org.openrdf.rio.helpers.RDFParserBase.reportFatalError(RDFParserBase.java:671) 在 org.openrdf.rio.turtle.TurtleParser.reportFatalError(TurtleParser.java:1306) 在 org.openrdf.rio.turtle.TurtleParser.parseValue(TurtleParser.java:637) 在 org.openrdf.rio.turtle.TurtleParser.parseSubject(TurtleParser.java:449) 在 org.openrdf.rio.turtle.TurtleParser.parseTriples(TurtleParser.java:383) 在 org.openrdf.rio.turtle.TurtleParser.parseStatement(TurtleParser.java:261) 在 org.openrdf.rio.turtle.TurtleParser.parse(TurtleParser.java:216) 在 org.openrdf.rio.turtle.TurtleParser.parse(TurtleParser.java:159) 在 com.bigdata.rdf.sail.webapp.InsertServlet$InsertWithURLsTask.call(InsertServlet.java:556) 在 com.bigdata.rdf.sail.webapp.InsertServlet$InsertWithURLsTask.call(InsertServlet.java:414) 在 com.bigdata.rdf.task.ApiTaskForIndexManager.call(ApiTaskForIndexManager.java:68) 在 java.util.concurrent.FutureTask.run(FutureTask.java:266) 处 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ... 1 更多


loadRestAPI.sh 脚本基本上是以下内容中提到的脚本:

https://wiki.blazegraph.com/wiki/index.php/Bulk_Data_Load#Command_line

因此应该可以直接使用命令行工具而不是 REST API。

而且整个过程看起来也很尴尬。该工具依赖于 .gz 文件,该文件比 .bz2 文件大 25%,并且下载时间更长。解压缩 .bz2 文件比 munge 过程更快。我的假设是处理解压后的 230GB 文件,例如

230033083334 一月 4 07:29 wikidata-20180101-all-BETA.ttl

以“块明智”的方式可能会效果更好。但首先我们需要看看是什么导致了进口的停滞。

我的第一个问题是 shell 脚本 runBlazegraph.sh 给出了缺少 mwservices.json 的错误。

我假设一个文件像https://github.com/wikimedia/wikidata-query-deploy/blob/master/mwservices.json是期待。

所以我尝试用以下方法解决这个问题

wget https://raw.githubusercontent.com/wikimedia/wikidata-query-deploy/master/mwservices.json

尽管我怀疑这是否有多大意义。

实际调用

./loadRestAPI.sh -n wdq -d data/split/wikidump-000000001.ttl.gz 
Loading with properties...
quiet=false
verbose=0
closure=false
durableQueues=true
#Needed for quads
#defaultGraph=
com.bigdata.rdf.store.DataLoader.flush=false
com.bigdata.rdf.store.DataLoader.bufferCapacity=100000
com.bigdata.rdf.store.DataLoader.queueCapacity=10
#Namespace to load
namespace=wdq
#Files to load
fileOrDirs=data/split/wikidump-000000001.ttl.gz
#Property file (if creating a new namespace)
propertyFile=/home/wf/wikidata/wikidata-query-rdf/dist/target/service-0.3.0-SNAPSHOT/RWStore.properties
<?xml version="1.0"?><data modified="0" milliseconds="493832"/>DATALOADER-SERVLET: Loaded wdq with properties: /home/wf/wikidata/wikidata-query-rdf/dist/target/service-0.3.0-SNAPSHOT/RWStore.properties

我在使用 Java 1.8.0_151 的 Ubuntu 16.04 LTS 服务器上工作,所以我相信我们必须研究更多细节来解决 Thomas 的问题。

也可以看看https://wikitech.wikimedia.org/wiki/Nova_Resource:Wikidata-query/Documentation

更多细节。

为了检查结果,我使用 ssh 隧道连接到我的 ubuntu 服务器

ssh -L 9999:localhost:9999 user@server

进而

http://localhost:9999/bigdata/namespace/wdq/sparql

在我的本地计算机(笔记本电脑)浏览器的浏览器中。

第二次导入也正常。

然后我使用以下 SPARQL 查询检查了数据库内容:

SELECT ?type (COUNT(?type) AS ?typecount)
WHERE {
  ?subject a ?type.
}
GROUP by ?type
ORDER by desc(?typecount)
LIMIT 7

给出结果

type                                          typecount
<http://wikiba.se/ontology#BestRank>            2938060
schema:Article                                  2419109
<http://wikiba.se/ontology#QuantityValue>.        78105
<http://wikiba.se/ontology#TimeValue>.            61553
<http://wikiba.se/ontology#GlobecoordinateValue>  57032
<http://wikiba.se/ontology#GeoAutoPrecision>       3462
<http://www.wikidata.org/prop/novalue/P17>.         531

考虑到导入经验,我想说 munge 和 loadRestAPI 调用可以在某种程度上并行运行,因为 loadRestAPI 步骤显然较慢。

导入每个 gz 文件大约需要 5 分钟。后来这个问题消失了,一些文件实际上在 Wolfgang 的服务器上花费了长达 1 小时 15 分钟的时间。

在 Wolfgang 的第一台机器上加载所有数据可能需要 10 天或更长时间,因此请继续关注最终结果。

目前,440 个文件中的 358 个是在 158 小时后在此计算机上导入的。此时 wikidata.jnl 文件有 250 GB 大,并且已导入约 17 亿条语句。

加载统计数据相当尴尬。在 Wolfgang 的机器上加载 *.ttl.gz 文件之一需要 87 到 11496 秒。此时平均为 944 秒。看起来在导入过程中的某些步骤中,每个 gz 文件的时间会增加,例如从 805 到 4943 秒或从 4823 到 11496 - 之后时间似乎稳定在更高的水平并回到 293 或 511 秒。这种计时行为使得预测完全导入需要多长时间变得非常困难。

鉴于装载时间较长,沃尔夫冈配置的第二台进口机器略有不同。

  1. 机器:8 核、56 GB RAM、6 TB 5.400 rpm 硬盘
  2. 机器:8 核、32 GB RAM、1 512 GB 7.200 rpm 硬盘和 1 480 GB SSD

第二台机器将要导入的数据存储在 7.200 rpm 硬盘上,并将 blazegraph 日志文件存储在 SSD 上。

第二台机器导入在导入完成 3.8 天后显示出更好的计时行为,统计数据如下:

    |  sum d |   sum h |         mins |         secs |
----+--------+---------+--------------+--------------+
MIN |  0.0 d |   0.0 h |     1.2 mins |      74 secs |      
MAX |  0.0 d |   1.1 h |    64.4 mins |    3863 secs |
AVG |  0.0 d |   0.2 h |    12.3 mins |     738 secs | 
TOT |  3.8 d |  90.2 h |  5414.6 mins |  324878 secs |

10天后第一台机器仍未完成

SUM | 10.5 d | 252.6 h | 15154.7 mins |  909281 secs |
----+--------+---------+--------------+--------------+
MIN |  0.0 d |   0.0 h |     1.5 mins |      87 secs |
MAX |  0.3 d |   7.3 h |   440.5 mins |   26428 secs |
AVG |  0.0 d |   0.6 h |    36.4 mins |    2185 secs |
TOT | 11.1 d | 267.1 h | 16029.0 mins |  961739 secs |
----+--------+---------+--------------+--------------+
ETA |  0.6 d |  14.6 h |   874.3 mins |   52458 secs |
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

本地 Blazegraph 上的 Wikidata :此处预期有 RDF 值,发现“”[第 1 行] 的相关文章

随机推荐

  • getbondeddevices() 不返回配对的蓝牙设备

    我正在尝试枚举与我的设备配对的所有蓝牙设备 在设置中我可以查看配对的设备 但以下代码不会返回任何项目 BluetoothAdapter bluetoothAdapter BluetoothAdapter getDefaultAdapter
  • Microsoft Visual Basic:如何初始化数组变量?

    我编写了一个宏 它对文档中一组特定文字样式的每个实例执行某些操作 为此 我通过以下方式创建了一个名称数组 Dim mylist 4 As String mylist 1 Heading 1 mylist 2 Heading 2 mylist
  • 如何将本地图像(svg / png)添加到绘图布局?

    我知道这个问题有几个答案 但没有一个让我满意 因为它们都包括Dash 我只想使用基本的plotly 我有一个本地图像文件 tmp bla svg 并且 tmp bla svg 我想在我的图表上显示为徽标 这是我的图形代码 使用来自的示例pl
  • 如何模拟 axios.create([config]) 函数以返回其实例方法而不是用模拟覆盖它们?

    我试图嘲笑axios create 因为我在整个应用程序中使用它的实例 并且显然需要它的所有实现 这些实现都被模拟破坏了 因此无法正确获取 get post 方法的结果 实际文件中的代码如下所示 export const axiosInst
  • Android - 网络广播流媒体[关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 目前不接受答案 我打算为一个当地广播电台制作一个 Android 应用程序 我需要制作广播节目的互联网流媒体 您能否为此提供一些起点 一些教程或其他东西 源的 UR
  • 使用 Swig/Python 在 C 中传递多个参数并分配字符串

    我使用 SWIG 包装以下 C 接口以从 Python 访问它 void some method char output int paramA const char paramB int paramC C 中的实现在运行时使用 malloc
  • 无法在 Formik onSubmit 中设置错误

    我这几天遇到了一些问题 我在 Formik 表单的 onSubmit 方法中设置的每个错误都没有添加到错误属性中 我的具体问题是关于 GraphQL API 返回的后端错误 我的表格很长 所以我不会发布所有代码 但相关代码如下 这是我的表格
  • mysql 翻译表缺少语言回退

    我有一个这样的数据库结构 国家 CREATE TABLE IF NOT EXISTS countries id int 11 NOT NULL AUTO INCREMENT code varchar 2 COLLATE utf8 unico
  • Android Assets 文件夹中的 Mp3 音频无法从签名且 zip 对齐的 APK 中播放

    我正在加载 mp3 文件以在基于 AndEngine 的 Android 游戏中玩 当我将游戏打包为 APK 时 资产文件夹中的 mp3 音频会抛出错误 无法作为文件描述符打开 它可能已被压缩 但是 当我使用 Eclipse MOTODEV
  • 如何使侧边栏与内容div的高度相同?

    代码如下 CSS container border 1px dashed 000 overflow hidden content sidebar float left width 50 content background yellow s
  • 处理传单地图中的ajax请求

    我有一个非常基本的传单地图 使用leaflet panel layers创建一个漂亮的图层控件 我有两个函数来创建图层和叠加层 我的数据位于外部 geoJSON 文件中 这似乎是我的问题 因为传单不提供任何获取外部 geoJSON 的内容
  • 如何选择SQL数据库表中的第n行?

    我有兴趣学习一些 理想情况下 与数据库无关的选择方法n数据库表中的第行 了解如何使用以下数据库的本机功能来实现这一点也很有趣 SQL服务器 MySQL PostgreSQL SQLite Oracle 我目前正在 SQL Server 20
  • 如何使用 float/double 的模数?

    我正在为学校项目创建 RPN 计算器 但在使用模数运算符时遇到了问题 由于我们使用的是双精度数据类型 因此模数不适用于浮点数 例如 0 5 0 3 应该返回 0 2 但我遇到了被零除的异常 指令说要使用fmod 我到处寻找fmod 包括ja
  • 在显示上下文菜单之前右键单击选择 TreeView 节点

    我想在显示 ContextMenu 之前右键单击选择一个 WPF TreeView 节点 对于 WinForms 我可以使用这样的代码查找在上下文菜单下单击的节点 WPF 替代品有哪些 根据树的填充方式 发件人和 e Source 值可能会
  • 从室内自行车数据特征解码蓝牙数据

    我正在尝试使用健身机器服务 室内自行车数据特征来获取节奏数据 通过使用 nRF Connect Android 应用程序 我可以看到数据就在那里 示例数据 inst speed 8 5km h inst cadence 45 0 per m
  • 比较效率

    一般情况下什么比较快 if num gt 10 or if num lt 10 编译器很可能会优化这类事情 不用担心 在这种情况下只需编写代码以保持清晰即可 汇编语言通常有以下操作 gt and lt 步数与 lt and gt 例如 用摩
  • iPad 视网膜图像 - 为什么使用两种不同的图像尺寸?

    对于 iPad Retina 或 iPhone Retina 为什么我们需要有两种类型的图像尺寸并为 Retina 版本添加 2x 之类的后缀 难道我们不能只有一种类型的视网膜分辨率图像 而对于没有视网膜显示屏的设备 让设备处理将图像调整为
  • .Net Treeview 事件处理

    我正在将 VB6 应用程序迁移到 Net 我们必须始终提供类似的功能 一种形式是带有复选框的树视图 该复选框具有三级节点 第一级仅用于对下一级进行分组 并且它们不可检查 第二级节点可由用户检查 并且当检查或取消检查时 其所有子节点都会效仿
  • Protobuf-net - 序列化 .NET GUID - 如何在 C++ 中读取它?

    我在 NET 应用程序中使用 Protobuf net 相对轻松地序列化了一个对象 我还使用 GetProto 命令获取 protobuf net 生成的 proto 文件 在 NET 生成的 proto 文件中 我的 GUID 字段的类型
  • 本地 Blazegraph 上的 Wikidata :此处预期有 RDF 值,发现“”[第 1 行]

    我们 Thomas 和 Wolfgang 已按照此处的说明在本地安装了 wikidata 和 blazegraph https github com wikimedia wikidata query rdf blob master docs