问题描述
我正在开发一个使用 Apache Jena (3.14.0) 将三元组保存到 Anzo 或 Fuseki(用于本地测试)的代码库。
我正在尝试调整代码以支持 AWS Neptune - 请参阅相关 question。
一位 SO 用户让我注意到 Neptune 不支持 GSP。
我正在查看的代码使用 RDFConnection.load(String graphName,Model model) 表示法保留三元组。
我的想法是将其转换为 RDFConnection.update(Update update)。
换句话说:
"AdvancedProtectionAllowed"=dword:00000001
"AllowCrossOriginAuthPrompt"=dword:00000001
"AllowedDomainsForApps"="managedchrome.com,<domain>"
"AmbientAuthenticationInPrivateModesEnabled"=dword:00000000
"ApplicationLocaleValue"="en"
"AuthNegotiateDelegateallowlist"="<domain>"
"AuthSchemes"="basic,digest,ntlm,negotiate"
"AuthServerAllowlist"="<domain>"
"BasicAuthOverHttpEnabled"=dword:00000001
"BlockThirdPartyCookies"=dword:00000000
"browserSignin"=dword:00000002
"disableAuthNegotiateCnameLookup"=dword:00000000
"diskCacheDir"="${user_home}/Chrome_cache"
"diskCacheSize"=dword:06400000
"EnableAuthNegotiatePort"=dword:00000001
"GloballyScopeHTTPAuthCacheEnabled"=dword:00000000
... 将变成以下内容:
myRdfConnectionInstance.load( myGraphNameString,myJenaModel )
(myRdfConnectionInstance.update(
new UpdateBuilder()
.addInsert( myGraphNameString,myJenaModel )
.build()
);
代表一个 URN)
我的看法是,这种表示法将采用 SPARQL 更新协议,而不是 GSP,因此可以在 Neptune 中持久化三元组。
在这方面我感到欣慰的是,如果我省略了命名图形参数并只调用了 myGraphNameString
,那么该请求将适用于我尝试过的所有三元组存储。
不幸的是,使用命名图参数化的相同参数不仅在 Neptune 中失败,而且在我当地的 Fuseki 商店中也失败了。
javadoc 声明:
将模型中的所有语句添加到插入语句中。[...]
...这在英语方面令人困惑,但似乎倾向于我想要的。
我怀疑描述的第二部分:
图形对象通过调用 makeNode() 进行转换。
...是我搞砸的地方。
不幸的是,我对三重店深度和耶拿都不太熟悉,所以我不知道下一步该去哪里。
问题
-
.addInsert( myJenaModel )
是否是将写入表示法转换为 SPARQL 更新以准备与 Neptune 兼容的正确方向? - 如果是这样,我在图形名称的参数化方面遗漏了什么?
- 除了此处引用的 API 之外,是否还有其他相关文档?
一些错误信息
我从 Neptune 得到的响应看起来像(为了清晰起见添加了格式):
RDFConnection#update
没有来自 Fuseki 的明确错误消息,只有 HTTP 400。
堆栈跟踪如下所示:
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]"
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)