如何在java中构建SPARQL查询?

Mar*_*eit 9 java string sparql

是否有一个库,它能够像CriteriaBuilderJPA 一样以编程方式构建SPARQL查询,或者像PreparedStatementfor SQL 一样构建查询?

类似(对于SQL):在Java中构建SQL字符串的最简洁方法

Rob*_*obV 7

最近版本的Jena添加了一个StringBuilder样式API,用于构建查询/更新字符串并根据需要对它们进行参数化.

调用此类,这是ParameterizedSparqlString使用它创建查询的示例:

ParameterizedSparqlString queryStr = new ParameterizedSparqlString();
queryStr.setNSPrefix("sw", "http://skunkworks.example.com/redacted#");
queryStr.append("SELECT ?a ?b ?c ?d");
queryStr.append("{");
queryStr.append("   ?rawHit sw:key");
queryStr.appendNode(someKey);
queryStr.append(".");
queryStr.append("  ?rawHit sw:a ?a .");
queryStr.append("  ?rawHit sw:b ?b .");
queryStr.append("  ?rawHit sw:c ?c . ");
queryStr.append("  ?rawHit sw:d ?d .");
queryStr.append("} ORDER BY DESC(d)");

Query q = queryStr.asQuery();
Run Code Online (Sandbox Code Playgroud)

免责声明 - 我是为Jena贡献此功能的开发人员

请参阅参数化SPARQL查询的最佳方法是什么?有关在各种API中执行此操作的更多讨论.


use*_*512 6

您可以使用两种方法在Jena中以编程方式构建查询:语法或代数.在jena wiki中有一个介绍.

使用代数你可以做类似的事情:

Op op;
BasicPattern pat = new BasicPattern();                 // Make a pattern
pat.add(pattern);                                      // Add our pattern match
op = new OpBGP(pat);                                   // Make a BGP from this pattern
op = OpFilter.filter(e, op);                           // Filter that pattern with our expression
op = new OpProject(op, Arrays.asList(Var.alloc("s"))); // Reduce to just ?s
Query q = OpAsQuery.asQuery(op);                       // Convert to a query
q.setQuerySelectType();                                // Make is a select query
Run Code Online (Sandbox Code Playgroud)

(摘自维基页面)

它不是CriteriaBuilder(也不打算),但是有一些方法.当你想要OR时,你OpJoin而不是AND,OpUnion等等.根据我的经验,痛点是表达式:你可能想要从字符串中解析它们.