我试图使用rdf4j库构建一个长查询,并希望使用SPARQL中可用的count函数。
原始的SPARQL查询如下所示:
SELECT (COUNT(?letter) AS ?count) WHERE { \
?letter a :Letter . \
?letter :writtenBy :John . \
?letter :writtenOn ?date . \
FILTER(?date > NOW() && } 到目前为止,我使用的是rdf4j库。
GraphPattern longPattern = GraphPatterns.tp(letter, ex.iri("a"), ex.iri("Letter")).
and(GraphPatterns.tp(letter, ex.iri("writtenBy"), ex.iri("John"))).
and(GraphPatterns.tp(letter, ex.iri("writtenOn"), date));如何实现计数并使用sparql的NOW()功能?我知道有一个过滤器方法,但我不知道如何使用它现在()。所有变量(字母、日期)和select查询都是在java中使用SparqlBuilder初始化的。
发布于 2021-05-19 01:58:13
在RDF4J SparqlBuilder中,函数是使用org.eclipse.rdf4j.sparqlbuilder.constraint.Expressions静态方法创建的。例如,要创建BNode()函数,只需执行以下操作:
Expression bnodeFunc = Expressions.bnode();类似地,对于COUNT聚合函数:
Expression countAgg = Expressions.count(letter);为了在SELECT子句中使用它,您可以这样做:
Variable count = SparqlBuilder.var("count");
Projection select = SparqlBuilder.select(countAgg.as(count));对于now()函数:恼人的是,Expressions中的函数工厂方法列表是不完整的:对于now(),没有直接的静态工厂方法。但是,您可以使用通用的Expressions.function方法来创建它,如下所示:
Expression nowFunc = Expressions.function(SparqlFunction.NOW);顺便说一句,您当前的图形模式可以简化很多。而不是这样:
GraphPattern longPattern = GraphPatterns.tp(letter, default.iri("a"), default.iri("Letter")).
and(GraphPatterns.tp(letter, default.iri("writtenBy"), legislate.iri("John"))).
and(GraphPatterns.tp(letter, legislate.iri("writtenOn"), date));这样做:
TriplePattern longPattern = letter.isA(ex.iri("Letter"))
.andHas(ex.iri("writtenBy"), legislate.iri("John"))
.andHas(legislate.iri("writtenOn"), date);这更容易理解和缩短,其次,您对default.iri("a")的使用是不正确的(顺便说一句,我甚至不知道为什么您有一个名为default的Java变量,因为这是一个保留关键字,应该会导致编译错误--所以我在这里用ex替换了)。
如果把这些都放在一起,你就会得到这样的东西:
SelectQuery select = Queries.SELECT()
.prefix(ex)
.prefix(legislate)
.select(countAgg.as(count))
.where(GraphPatterns.and(longPattern)
.filter(Expressions.gt(date, nowFunc)));https://stackoverflow.com/questions/67588129
复制相似问题