在指定命名图时,将RDFConnection.load(StringgraphName,Modelmodel)转换为SP



我正在开发一个代码库,该代码库使用ApacheJena(3.14.0(将三元组保存到Anzo或Fuseki中(用于本地测试(。

我正在尝试调整代码以支持AWS Neptune-请参阅相关问题。

一位SO用户让我注意到Neptune不支持GSP。

我正在查看的代码使用RDFConnection.load(StringgraphName,Modelmodel(表示法持久化三元组。

我的想法是将其转换为RDFConnection.update(更新更新(。

换句话说:

myRdfConnectionInstance.load( myGraphNameString, myJenaModel )

会变成

myRdfConnectionInstance.update(
new UpdateBuilder()
.addInsert( myGraphNameString, myJenaModel )
.build()
);

(myGraphNameString表示URN(

我的看法是,这种表示法将使用SPARQL更新协议,而不是GSP,因此能够在Neptune中持久化三元组。

在这方面,我感到欣慰的是,如果我省略了命名图参数,只调用.addInsert( myJenaModel ),那么该请求对我尝试过的所有三重存储都是有效的。

不幸的是,同样的命名图参数化不仅在Neptune失败了,在我当地的Fuseki商店也失败了。

javadoc声明:

将模型中的所有语句(指定的图(添加到插入语句中。[…]

。。。这在英语方面令人困惑,但似乎倾向于我想要的。

我怀疑描述的第二部分:

图形对象通过调用makeNode((进行转换。

。。。就是我搞砸的地方。

不幸的是,我既不太熟悉深度的三重商店,也不太熟悉耶娜,所以我不知道下一步该去哪里。

问题

  • RDFConnection#update是否是将写符号转换为SPARQL更新的正确方向,从而为与Neptune的兼容性做准备
  • 如果是这样的话,我对图形名称的参数化缺少什么
  • 除了这里引用的API之外,是否还有其他相关的文档

一些错误消息

我从Neptune得到的回复看起来像(为了清晰起见,添加了格式(:

Http exception response 
{
"detailedMessage":"Malformed query: Illegal subject value: 
"urn:[my URN]"^^<http://www.w3.org/2001/XMLSchema#string> [line 2]",
"code":"MalformedQueryException","requestId":"[some UUID]"
}

Fuseki没有明确的错误消息,只有HTTP400。

堆栈跟踪看起来像:

org.apache.jena.atlas.web.HttpException: 400 - Bad Request
at org.apache.jena.riot.web.HttpOp.exec(HttpOp.java:1091)
at org.apache.jena.riot.web.HttpOp.execHttpPost(HttpOp.java:721)
at org.apache.jena.riot.web.HttpOp.execHttpPost(HttpOp.java:517)
at org.apache.jena.riot.web.HttpOp.execHttpPost(HttpOp.java:473)
at org.apache.jena.rdfconnection.RDFConnectionRemote.lambda$updateExec$6(RDFConnectionRemote.java:324)
at org.apache.jena.rdfconnection.RDFConnectionRemote.exec(RDFConnectionRemote.java:668)
at org.apache.jena.rdfconnection.RDFConnectionRemote.updateExec(RDFConnectionRemote.java:324)
at org.apache.jena.rdfconnection.RDFConnectionRemote.update(RDFConnectionRemote.java:311)
at org.apache.jena.rdfconnection.RDFConnection.update(RDFConnection.java:250)
at [my code]

在通过RDF4J的两步过程中,批量加载到Netpune似乎是可行的。编写了一个生成RDF(NT文件(的程序,然后使用RDF4J控制台将其手动加载到Neptune中。

猜测:如果我们深入研究RDF4J以及Neptune是如何接受它的大量负载的,那么在同一个程序中完成整个负载可能是可行的。

$ ./bin/console.sh
04:10:40.412 [main] DEBUG org.eclipse.rdf4j.common.platform.PlatformFactory - os.name = linux
04:10:40.416 [main] DEBUG org.eclipse.rdf4j.common.platform.PlatformFactory - Detected Posix platform
Connected to default data directory
RDF4J Console 3.6.3
Working dir: /home/bitnami/tools/eclipse-rdf4j-3.6.3
Type 'help' for help.
> create sparql
Please specify values for the following variables:
SPARQL query endpoint: https://yyy.cluster-xxx.us-east-1.neptune.amazonaws.com:8182/sparql
SPARQL update endpoint: https://yyy.cluster-xxx.us-east-1.neptune.amazonaws.com:8182/sparql
Local repository ID [endpoint@localhost]: test
Repository title [SPARQL endpoint repository @localhost]: test Graph data model PoC
Repository created
> open test
test> sparql select ?s ?p ?o where {?s ?p ?o} limit 10
Evaluating SPARQL query...
+------------------------+------------------------+------------------------+
| s                      | p                      | o                      |
+------------------------+------------------------+------------------------+
| <https://test.com/s>   | <https://test.com/p>   | <https://test.com/o>   |
+------------------------+------------------------+------------------------+
1 result(s) (671 ms)
test> clear
test> load /home/bitnami/projects/model/sparql-client/output/model.nt

最新更新