有没有一种库可以像JPA中的CriteriaBuilder
或像SQL中的PreparedStatement
那样以编程方式构建SPARQL查询?
类似于SQL的做法:在Java中构建最干净的SQL字符串的方法
有没有一种库可以像JPA中的CriteriaBuilder
或像SQL中的PreparedStatement
那样以编程方式构建SPARQL查询?
类似于SQL的做法:在Java中构建最干净的SQL字符串的方法
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
(来自维基页面)
它不是CriteriaBuilder
(也不打算成为它),但已经接近了一些。您使用OpJoin
而不是AND,使用OpUnion
当您想要OR等等。在我的经验中,痛点在于表达式:您可能希望从字符串中解析它们。
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();
免责声明 - 我是为Jena贡献此功能的开发者
请参见如何在各种API中对SPARQL查询进行参数化?以获取更多讨论。
我实现了SPARQL Java - 一种在Java中编写SPARQL查询的DSL。
它解决了IDE自动格式化连接的SPARQL查询字符串等问题。
例如:
String shortQuery = Q.prefix("books", "http://example.org/books#")
.select("?book ?authorName", new where() {
{
$("?book books:author ?author");
$("?author books:authorName ?authorName");
}
}).get();
我最近开始使用Sesame查询构建器。它看起来很有前途,但是它并没有提供太多的文档,让我很难找到例子。这里是一个简单的示例,可能会帮助你入门:
ParsedTupleQuery query = QueryBuilderFactory
.select("pubProperty", "pubPropertyValue")
.group()
.atom(cmResource(resourceId), LinkPublicationsTransformation.REFERENCE_URI, "pubUri")
.atom("pubUri", "pubProperty", "pubPropertyValue")
.filter(isLiteral("pubPropertyValue"))
.closeGroup()
.query();
isLiteral
和cmResource
是我自己编写的小型静态辅助类。例如,isLiteral
代表new IsLiteral(new Var("..."))
,后者使用我的常用前缀创建URI。
你可能还会对SPARQLQueryRenderer
感兴趣,它可以将ParsedQuery
转换为String
,以便进一步使用。
如果你最终采用了String(Builder)
方法,我不建议这样做,请至少查看来自sesame-queryrendered
的RenderUtils
,其中包含所有方便添加<
>
围绕URI,转义特殊字符等的方法。
Eclipse RDF4J框架(Sesame的后继者)提供了一个存储库API,类似于JDBC-它允许您创建一个准备好的查询对象,并在执行之前注入变量绑定:
String query = "SELECT * WHERE {?X ?P ?Y }";
TupleQuery preparedQuery = conn.prepareQuery(QuerLanguage.SPARQL, query);
preparedQuery.setBinding("X", someValue);
...
TupleQueryResult result = preparedQuery.evaluate();
query.prefix(foaf).select(name)
.where(x.has(foaf.iri("name"), name))
.orderBy(name)
.limit(5)
.offset(10);
query.prefix(foaf).select(name)
.where(x.has(foaf.iri("name"), name))
.orderBy(name)
.limit(5)
.offset(10);
https://jena.apache.org/documentation/extras/querybuilder/index.html
它做你想要的事情。