sparql - SPARQL:将查询结果作为 RDF LIST 插入
问题描述
我想从图表中得到绑定到特定变量的结果让我们说?s。
接下来,我想将这些结果作为 RDF 列表插入到图 B 中。
这是我的 SPARQL 更新:
prefix foo:<http://foo.com/>
insert
{
graph <http://B.com>
{
?var foo:propA foo:A ;
foo:propB [ foo:propA foo:A ;
foo:propX ( ?s )
] ;
foo:propC ?o .
}
}
where
{
graph <http://A.com>
{
?s ?p ?o.
BIND(URI(CONCAT("http://example.org/", STRAFTER( STR(?o), "http://someuri.org/"))) as ?var)
}
}
我的问题是它插入了这些数据:
<http://example.org/varX> foo:propA foo:A ;
foo:propB [ foo:propA foo:A ;
foo:propX ( <http://s1.com> )
],
[
foo:propA foo:A ;
foo:propX ( <http://s2.com> )
] ;
foo:propC <http://oX.com> .
相反,我希望它插入这个:
<http://example.org/varX> foo:propA foo:A ;
foo:propB [ foo:propA foo:A ;
foo:propX ( <http://s1.com> <http://s2.com> )
] ;
foo:propC <http://oX.com> .
我能达到这个结果吗,有可能吗?
基本上我想为 foo:propX 谓词设置对象,这是一个包含绑定到变量 ?s 的元素值的 RDF 列表。
注意:完全相同的查询在 RDF4J 中执行得很好,但奇怪的是导致 Blazegraph 抛出一个
MalformedQueryException: Undefined vocabulary: http://www.w3.org/1999/02/22-rdf-syntax-ns#first
解决方案
我认为仅使用 SPARQL 是不可能的。您需要使用一些 API 功能来创建 RDF 集合。
一种方法是首先将您的 graphB 构造为Model
内存中的对象,然后在最后一次性插入该模型。这些方面的东西(未经测试,但这应该说明一般的想法 - 请查看 RDF4J 文档和 javadoc 了解更多详细信息):
ValueFactory vf = conn.getValueFactory();
TupleQuery query = conn.prepareTupleQuery("SELECT ?s ?o ?var WHERE ...");
List<BindingSet> queryResult = QueryResults.asList(query.evaluate());
// map values of var to values of S
Map<Value, List<Value>> varToS = new HashMap<>();
... // do something clever with the query result to fill this HashMap
// start building our result graph
Model graphB = new TreeModel()
ModelBuilder mb = new ModelBuilder(graphB);
mb.setNamespace("foo", "http://example.org/");
mb.namedGraph("foo:graphB");
for(Value var: varToS.keySet()) {
BNode propBValue = vf.createBNode();
BNode propXValue = vf.createBNode();
mb.subject(var)
.add("foo:propA", "foo:A")
.add("foo:propB", propBValue)
.subject(propBValue)
.add("foo:propA", "foo:A")
.add("foo:propX", propXValue);
// add the values of ?s for the given v as a collection
RDFCollections.asRDF(varToSet.get(var), propXValue, graphB);
}
// insert our created graphB model into the database
conn.add(graphB);
推荐阅读
- wordpress - woocommerce_order_status_completed 没有数据
- javascript - CS Node js 帮助:编写测试指定的 GET/PUT 请求?
- swiftui - 如何在 SwiftUI 中手动显示 DatePicker
- python - PyTorch resnet 坏张量维度
- python - 无法使用 MongoDB 从 Django 管理面板中删除对象
- mysql - MySQL 和 MariaDB 中的 JSON_SEARCH 差异
- discord - 如何在 Discord.JS 中创建一个比角色层次结构中的其他角色高一点的角色?
- python - 使用 py2app 创建独立应用程序
- android - Flutter SfCartesianChart 不显示 X 。Y 轴
- c++ - 如何获取 beast::flat_buffer 中的数据?