java - 当我执行插入查询 RDF4J 时如何获取 UpdateExpr

标签 java parsing sparql rdf4j

插入查询的问题,无法解析简单的语句

例子: 查询:

PREFIX dc: <http://purl.org/dc/elements/1.1/>
INSERT DATA 
{
    <http://example/book1> dc:title "A new book";
                           dc:creator "A.N.Other" .
}

结果:

PREFIX dc: <http://purl.org/dc/elements/1.1/> 
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> 
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#> 
PREFIX sesame: <http://www.openrdf.org/schema/sesame#> 
PREFIX owl: <http://www.w3.org/2002/07/owl#> 
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#> 
PREFIX fn: <http://www.w3.org/2005/xpath-functions#> 
 <http://example/book1> dc:title "A new book" ; dc:creator "A.N.Other" .

但如果我解析更难的东西,一切都很好。

查询:

PREFIX dc:  <http://purl.org/dc/elements/1.1/>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>

INSERT 
  { GRAPH <http://example/bookStore2> { ?book ?p ?v } }
WHERE
  { GRAPH  <http://example/bookStore>
       { ?book dc:date ?date .
         FILTER ( ?date > "1970-01-01T00:00:00-02:00"^^xsd:dateTime )
         ?book ?p ?v
  } }

结果:

StatementPattern FROM NAMED CONTEXT
   Var (name=book)
   Var (name=p)
   Var (name=v)
   Var (name=_const_f1165b11_uri, value=http://example/bookStore2, anonymous)

Modify
   StatementPattern FROM NAMED CONTEXT
      Var (name=book)
      Var (name=p)
      Var (name=v)
      Var (name=_const_f1165b11_uri, value=http://example/bookStore2, anonymous)
   Filter
      Compare (>)
         Var (name=date)
         ValueConstant (value="1970-01-01T00:00:00-02:00"^^<http://www.w3.org/2001/XMLSchema#dateTime>)
      Join
         StatementPattern FROM NAMED CONTEXT
            Var (name=book)
            Var (name=_const_9b277d39_uri, value=http://purl.org/dc/elements/1.1/date, anonymous)
            Var (name=date)
            Var (name=_const_39534d41_uri, value=http://example/bookStore, anonymous)
         StatementPattern FROM NAMED CONTEXT
            Var (name=book)
            Var (name=p)
            Var (name=v)
            Var (name=_const_39534d41_uri, value=http://example/bookStore, anonymous)

我需要在第一个案例中得到类似的东西。我做错了什么?

执行这些查询的 Java 代码:

String query = ...
SPARQLParser parser = new SPARQLParser();
ParsedUpdate q2 = parser.parseUpdate(query, null);
Iterator var2 = q2.getUpdateExprs().iterator();
UpdateExpr updateExpr = (UpdateExpr)var2.next();
System.out.println(updateExpr);

最佳答案

如注释中所示,INSERT DATA SPARQL 更新的数据 block 在内部存储为(未解析的)字符串。如果您想进一步处理它,您有几个选择。

一个选择是实际上只执行更新,例如针对临时/空内存存储,然后只从该存储中检索语句:

 String update = "INSERT DATA { .... }";
 Repository tempRep = new SailRepository(new MemoryStore());
 tempRep.init();
 try(RepositoryConnection conn = tempRep.getConnection()) {
     conn.prepareUpdate(update).execute());
     Model statements = QueryResults.asModel(conn.getStatements(null, null, null));
 }

另一种可能更具可扩展性的选择是将数据 block 提取为字符串并将其传递给解析器。 SPARQLUpdateDataBlockParser 专门为此目的而存在:

InsertData insertDataExpr = (InsertData)updateExpr;

RDFParser parser = new SPARQLUpdateDataBlockParser();
StatementCollector handler = new StatementCollector();
parser.setRDFHandler(handler);

parser.parse(new StringReader(insertDataExpr.getDataBlock()), "");

Collection<Statement> stmts = handler.getStatements();

关于java - 当我执行插入查询 RDF4J 时如何获取 UpdateExpr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55118469/

相关文章:

java - 矩阵中的 ArrayIndexOutOfBoundsException

java - Parse.com - Android - 在大对象列表中搜索 3 个对象

c++ - boost spirit X3 : Collapsing one-element lists

sparql - Sesame 2.8.4 子查询限制错误修复?

sparql - 两个资源之间的路径

java - 我如何将 Fuseki 与 Jena TDB 一起使用

java - 使用 swing 代码获得意外的输出

java - 在使用Gradle构建的Java控制台应用程序中使用system.in的任何替代方法?

python - BeautifulSoup 库的 HTML 解析问题

c++ - Bison: what(): basic_string::_S_construct null 无效