【问题标题】:How to construct long queries using rdf4j如何使用 rdf4j 构造长查询
【发布时间】:2021-05-18 14:17:55
【问题描述】:

我正在尝试使用 rdf4j 库构建一个长查询,并希望使用 SPARQL 提供的计数函数。

原始的 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));

如何实现 Count 并使用 sparql 的 NOW() 功能?我知道有一种过滤方法,但我不知道如何使用 NOW() 。所有变量(字母、日期)和选择查询都已在 java 中使用 SparqlBuilder 初始化。

【问题讨论】:

  • 为什么你有FILTER(?date > NOW() && } 而不仅仅是FILTER(?date > NOW())}
  • 另外,如果您详细说明当前方法遇到的错误,将会很有帮助。
  • 过滤函数接受表达式,你应该看看rdf4j.org/documentation/tutorials/sparqlbuilder 中的第 5 部分 - 也许,now() 不在现有表达式中,如果不是,它应该在函数中,请参阅 @ 987654327@枚举

标签: sparql rdf4j


【解决方案1】:

在 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)));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多