首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用rdf4j构造长查询

如何使用rdf4j构造长查询
EN

Stack Overflow用户
提问于 2021-05-18 14:17:55
回答 1查看 180关注 0票数 0

我试图使用rdf4j库构建一个长查询,并希望使用SPARQL中可用的count函数。

原始的SPARQL查询如下所示:

代码语言:javascript
复制
SELECT (COUNT(?letter) AS ?count) WHERE { \
    ?letter a :Letter . \
    ?letter :writtenBy :John . \
    ?letter :writtenOn ?date . \
    FILTER(?date > NOW() && }     

到目前为止,我使用的是rdf4j库。

代码语言:javascript
复制
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初始化的。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-19 01:58:13

在RDF4J SparqlBuilder中,函数是使用org.eclipse.rdf4j.sparqlbuilder.constraint.Expressions静态方法创建的。例如,要创建BNode()函数,只需执行以下操作:

代码语言:javascript
复制
Expression bnodeFunc = Expressions.bnode();

类似地,对于COUNT聚合函数:

代码语言:javascript
复制
Expression countAgg = Expressions.count(letter);

为了在SELECT子句中使用它,您可以这样做:

代码语言:javascript
复制
Variable count = SparqlBuilder.var("count");
Projection select = SparqlBuilder.select(countAgg.as(count));

对于now()函数:恼人的是,Expressions中的函数工厂方法列表是不完整的:对于now(),没有直接的静态工厂方法。但是,您可以使用通用的Expressions.function方法来创建它,如下所示:

代码语言:javascript
复制
Expression nowFunc = Expressions.function(SparqlFunction.NOW);

顺便说一句,您当前的图形模式可以简化很多。而不是这样:

代码语言:javascript
复制
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));

这样做:

代码语言:javascript
复制
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替换了)。

如果把这些都放在一起,你就会得到这样的东西:

代码语言:javascript
复制
SelectQuery select = Queries.SELECT()
        .prefix(ex)
        .prefix(legislate)
        .select(countAgg.as(count))
        .where(GraphPatterns.and(longPattern)
                .filter(Expressions.gt(date, nowFunc)));
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67588129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档