Sparql 如何使用rdf4j构造长查询

Sparql 如何使用rdf4j构造长查询,sparql,rdf4j,Sparql,Rdf4j,我正在尝试使用rdf4j库构造一个长查询,并希望使用SPARQL提供的count函数 原始SPARQL查询如下所示: SELECT (COUNT(?letter) AS ?count) WHERE { \ ?letter a :Letter . \ ?letter :writtenBy :John . \ ?letter :writtenOn ?date . \ FILTER(?date > NOW() && } 这就是到目前为止

我正在尝试使用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()功能?我知道有一个filter方法,但我不知道如何将NOW()用于它。所有变量(字母、日期)和select查询都是使用SparqlBuilder在java中初始化的。

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

Expression bnodeFunc=Expressions.bnode();
类似地,对于
COUNT
aggregate函数:

Expression countAgg=Expressions.count(字母);
要在SELECT子句中使用它,您可以执行以下操作:

SELECT (COUNT(?letter) AS ?count) WHERE { \
    ?letter a :Letter . \
    ?letter :writtenBy :John . \
    ?letter :writtenOn ?date . \
    FILTER(?date > NOW() && }     
Variable count=SparqlBuilder.var(“count”);
投影选择=SparqlBuilder.select(countAgg.as(count));
至于
now()
函数:令人烦恼的是,
表达式中的函数工厂方法列表不完整:对于
now()
没有直接的静态工厂方法。但是,您可以使用常规的
Expressions.function
方法来创建它,如下所示:

Expression nowFunc=Expressions.function(SparqlFunction.NOW);
顺便说一下,您当前的图形模式可以简化很多。与此相反:

GraphPattern longPattern=GraphPatterns.tp(字母,default.iri(“a”),default.iri(“字母”)。
和(GraphPatterns.tp(letter,default.iri(“writenby”)、legite.iri(“John”))。
和(GraphPatterns.tp(信函、立法、iri(“书面形式”),日期));
这样做:

TriplePattern longPattern=letter.isA(例如iri(“letter”))
.andHas(前iri(“书面”),立法iri(“约翰”))
.andHas(立法iri(“书面”),日期);
这更容易阅读,也更简短,其次,您使用的
default.iri(“a”)
是不正确的(顺便说一句,我甚至不知道如何使用名为
default
的Java变量,因为这是一个保留关键字,应该会导致编译错误-因此我在这里用
ex
替换)

把这些放在一起,你会得到这样的结果:

SELECT (COUNT(?letter) AS ?count) WHERE { \
    ?letter a :Letter . \
    ?letter :writtenBy :John . \
    ?letter :writtenOn ?date . \
    FILTER(?date > NOW() && }     
SelectQuery=querys.select()
.前缀(ex)
.前缀(立法)
.选择(计数聚合为(计数))
.其中(图形模式)和(长模式)
.filter(Expressions.gt(date,nowFunc));

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

Expression bnodeFunc=Expressions.bnode();
类似地,对于
COUNT
aggregate函数:

Expression countAgg=Expressions.count(字母);
要在SELECT子句中使用它,您可以执行以下操作:

SELECT (COUNT(?letter) AS ?count) WHERE { \
    ?letter a :Letter . \
    ?letter :writtenBy :John . \
    ?letter :writtenOn ?date . \
    FILTER(?date > NOW() && }     
Variable count=SparqlBuilder.var(“count”);
投影选择=SparqlBuilder.select(countAgg.as(count));
至于
now()
函数:令人烦恼的是,
表达式中的函数工厂方法列表不完整:对于
now()
没有直接的静态工厂方法。但是,您可以使用常规的
Expressions.function
方法来创建它,如下所示:

Expression nowFunc=Expressions.function(SparqlFunction.NOW);
顺便说一下,您当前的图形模式可以简化很多。与此相反:

GraphPattern longPattern=GraphPatterns.tp(字母,default.iri(“a”),default.iri(“字母”)。
和(GraphPatterns.tp(letter,default.iri(“writenby”)、legite.iri(“John”))。
和(GraphPatterns.tp(信函、立法、iri(“书面形式”),日期));
这样做:

TriplePattern longPattern=letter.isA(例如iri(“letter”))
.andHas(前iri(“书面”),立法iri(“约翰”))
.andHas(立法iri(“书面”),日期);
这更容易阅读,也更简短,其次,您使用的
default.iri(“a”)
是不正确的(顺便说一句,我甚至不知道如何使用名为
default
的Java变量,因为这是一个保留关键字,应该会导致编译错误-因此我在这里用
ex
替换)

把这些放在一起,你会得到这样的结果:

SELECT (COUNT(?letter) AS ?count) WHERE { \
    ?letter a :Letter . \
    ?letter :writtenBy :John . \
    ?letter :writtenOn ?date . \
    FILTER(?date > NOW() && }     
SelectQuery=querys.select()
.前缀(ex)
.前缀(立法)
.选择(计数聚合为(计数))
.其中(图形模式)和(长模式)
.filter(Expressions.gt(date,nowFunc));

为什么有
FILTER(?date>NOW()&&&}
而不仅仅是
FILTER(?date>NOW())}
?另外,如果您详细说明当前方法会出现什么错误,这将很有帮助。FILTER函数采用表达式,您应该看看-也许,
NOW()中的第5节
不在现有表达式中,如果不在,则应在函数中,请参阅
SparqlFunction
enum为什么要使用
FILTER(?date>NOW()&&}
而不仅仅是
FILTER(?date>NOW())}
?此外,如果您详细说明当前方法中出现的错误,这将非常有帮助。筛选函数采用表达式,您应该查看第5节-也许,
now()
不在现有表达式中,如果不在现有表达式中,则应在函数中,请参阅
SparqlFunction
enum