我正在开发一个代码库,该代码库使用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