Linux命令行上传Jena-Fuseki数据集至单元测试前置流程问题
Jena Fuseki 数据集上传问题解决
问题场景
需要在Linux shell脚本中运行单元测试前,向Jena Fuseki 3.13.1上传数据集,尝试了以下命令均存在问题:
尝试1:命令行直接加载数据集但无法更新
~/jena_for_unit_testing/apache-jena-fuseki-3.13.1> ./fuseki-server --update --file ds_2024-04-25_13-58-06.nq.gz --port 3031 /test
报错:Error 404: No endpoint: /test/update
尝试2:同时使用配置文件和命令行数据集参数
~/jena_for_unit_testing/apache-jena-fuseki-3.13.1> ./fuseki-server --config run/config.ttl --update --file ds_2024-04-25_13-58-06.nq.gz --port 3031
报错:Dataset specified on the command line but a configuration file also given.
尝试3:通过配置文件启动服务,但不知如何上传数据集
~/jena_for_unit_testing/apache-jena-fuseki-3.13.1> ./fuseki-server --config run/config.ttl --update --port 3031
服务正常启动,但无法通过命令行上传指定的ds_2024-04-25_13-58-06.nq.gz数据集。
补充尝试:curl上传数据报错
使用curl命令上传同版本Fuseki生成的NQ备份文件:
curl -i -XPOST "http://localhost:3031/ds" --data-binary ds_2024-04-25_13-58-06.nq --header "Content-type: application/n-quads"
Fuseki报错:[2024-05-03 06:05:43] Fuseki INFO [1] 400 Parse error: [line: 1, col: 26] Premature end of file: [EOF] (13 ms)
错误原因分析
- 尝试1的404错误:命令行参数顺序错误。
--update是数据集级别的参数,需要放在数据集挂载路径(/test)之后,否则Fuseki不会为该数据集启用更新端点。 - 尝试2的冲突错误:配置文件(
config.ttl)已经定义了数据集的配置,不能同时在命令行用--file指定数据集,二者只能选其一。 - curl上传的解析错误:
--data-binary参数后未加@符号,导致curl将文件名字符串而非文件内容发送给Fuseki,Fuseki解析无效内容时触发EOF错误。
解决方案
方案1:命令行直接启动并加载数据集(无需配置文件)
调整参数顺序,将--update和--file放在数据集路径之后:
cd ~/jena_for_unit_testing/apache-jena-fuseki-3.13.1 ./fuseki-server --port 3031 /test --update --file ds_2024-04-25_13-58-06.nq.gz
此命令会启动Fuseki服务,在/test端点创建可更新的数据集,并直接加载指定的NQ压缩文件。
方案2:通过配置文件启动,再用curl上传数据集
步骤1:启动Fuseki服务
使用配置文件正常启动服务:
cd ~/jena_for_unit_testing/apache-jena-fuseki-3.13.1 ./fuseki-server --config run/config.ttl --update --port 3031
步骤2:修正curl命令上传数据
在--data-binary后添加@符号指定文件路径,同时使用标准更新端点/ds/update:
- 上传未压缩的NQ文件:
curl -i -XPOST "http://localhost:3031/ds/update" \ --data-binary @ds_2024-04-25_13-58-06.nq \ --header "Content-type: application/n-quads"
- 直接上传GZ压缩文件:
curl -i -XPOST "http://localhost:3031/ds/update" \ --data-binary @ds_2024-04-25_13-58-06.nq.gz \ --header "Content-type: application/n-quads" \ --header "Content-Encoding: gzip"
方案3:集成到shell脚本(自动化流程)
如果需要在单元测试前自动完成Fuseki启动和数据加载,可以编写如下脚本:
#!/bin/bash # 定义路径和参数 FUSEKI_DIR=~/jena_for_unit_testing/apache-jena-fuseki-3.13.1 DATASET_FILE="${FUSEKI_DIR}/ds_2024-04-25_13-58-06.nq.gz" PORT=3031 DATASET_ENDPOINT="/test" # 停止可能运行的Fuseki进程(可选) pkill -f fuseki-server # 启动Fuseki并加载数据集 cd "${FUSEKI_DIR}" ./fuseki-server --port "${PORT}" "${DATASET_ENDPOINT}" --update --file "${DATASET_FILE}" > fuseki.log 2>&1 & # 等待服务启动 sleep 5 # 验证服务状态 curl -s "http://localhost:${PORT}/${DATASET_ENDPOINT}/sparql" > /dev/null if [ $? -eq 0 ]; then echo "Fuseki服务启动成功,数据集已加载" # 执行单元测试命令 # ./run_unit_tests.sh else echo "Fuseki服务启动失败,请检查日志" exit 1 fi
内容的提问来源于stack exchange,提问作者Jaana
相关产品推荐
相关产品推荐

