1
  1. 我想从图表中得到绑定到特定变量的结果让我们说?s。

  2. 接下来,我想将这些结果作为 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
4

1 回答 1

1

我认为仅使用 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);
于 2018-07-06T01:59:57.073 回答