Sparql Jena TDB,过滤器don';行不通

Sparql Jena TDB,过滤器don';行不通,sparql,jena,tdb,Sparql,Jena,Tdb,我使用Jena TDB存储文件中的三元组数据集。当我尝试使用filter向TDB发送SPARQL查询时,出现了一个问题。例如,以下查询起作用: select ?ob where { ?ob rdfs:label "NameOfLabel"@language . } 但这并不是: select ?ob where { ?ob rdfs:label ?pr . filter( ?pr = "NameOfLabel" ) . } 此查询的目的是从“NameOfLabel”(忽略语言)

我使用Jena TDB存储文件中的三元组数据集。当我尝试使用
filter
向TDB发送SPARQL查询时,出现了一个问题。例如,以下查询起作用:

select ?ob where {
  ?ob rdfs:label "NameOfLabel"@language .
}
但这并不是:

select ?ob where {
  ?ob rdfs:label ?pr .
  filter( ?pr = "NameOfLabel" ) .
} 
此查询的目的是从
“NameOfLabel”
(忽略语言)中查找
?ob
。我尝试了
regex
str(?pr)
,以及其他一些东西,但这些都不起作用。我该怎么做

更新(基于答案) 当我尝试使用
过滤器(str(?pr)=“NameOfLabel”)
时,我得到一个异常。以下是堆栈跟踪:

Exception in thread "main" java.lang.IllegalArgumentException: getLow: Empty RecordBuffer
    at com.hp.hpl.jena.tdb.base.buffer.RecordBuffer.getLow(RecordBuffer.java:59)
    at com.hp.hpl.jena.tdb.base.recordbuffer.RecordRangeIterator.hasNext(RecordRangeIterator.java:112)
    at org.apache.jena.atlas.iterator.Iter$4.hasNext(Iter.java:317)
    at com.hp.hpl.jena.tdb.sys.DatasetControlMRSW$IteratorCheckNotConcurrent.hasNext(DatasetControlMRSW.java:119)
    at org.apache.jena.atlas.iterator.Iter$4.hasNext(Iter.java:317)
    at org.apache.jena.atlas.iterator.Iter$3.hasNext(Iter.java:200)
    at org.apache.jena.atlas.iterator.Iter.hasNext(Iter.java:915)
    at org.apache.jena.atlas.iterator.RepeatApplyIterator.hasNext(RepeatApplyIterator.java:59)
    at com.hp.hpl.jena.tdb.solver.SolverLib$IterAbortable.hasNext(SolverLib.java:191)
    at org.apache.jena.atlas.iterator.Iter$4.hasNext(Iter.java:317)
    at com.hp.hpl.jena.sparql.engine.iterator.QueryIterPlainWrapper.hasNextBinding(QueryIterPlainWrapper.java:54)
    at com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:112)
    at com.hp.hpl.jena.sparql.engine.iterator.QueryIterConvert.hasNextBinding(QueryIterConvert.java:59)
    at com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:112)
    at com.hp.hpl.jena.sparql.engine.iterator.QueryIterDistinctReduced.hasNextBinding(QueryIterDistinctReduced.java:54)
    at com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:112)
    at com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorWrapper.hasNextBinding(QueryIteratorWrapper.java:40)
    at com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:112)
    at com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorWrapper.hasNextBinding(QueryIteratorWrapper.java:40)
    at com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:112)
    at com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorWrapper.hasNextBinding(QueryIteratorWrapper.java:40)
    at com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:112)
    at com.hp.hpl.jena.sparql.engine.ResultSetStream.hasNext(ResultSetStream.java:75)
编辑二:

Dataset dataset = TDBFactory.createDataset(DIRECTORY);
dataset.begin(ReadWrite.READ);

QueryExecution qExec = QueryExecutionFactory.create(query, dataset) ;
ResultSet risultati = qExec.execSelect();
while(risultati.hasNext()){
    system.out.println(risultati.next());
}
普通文本“NameOfLabel”与带有语言标记“NameOfLabel”@en的文本不同。如果

有效,那么我们也应该如此

?ob rdfs:label ?label .
filter ( ?label = "NameOfLabel"@en )      # (2)
如果要在不比较语言的情况下比较筛选器中的字符串内容,只需执行以下操作:

?ob rdfs:label ?label .
filter ( str(?label) = "NameOfLabel" )    # (3)
注意,(2)实际上不是很好的实践。根据精确值进行过滤没有多大意义,因为您可以只使用(1)。(3) 可以,因为您确实需要使用str函数。如果希望在运行时指定一些精确的值,并在查询中包含变量,还可以选择

values ?label { "NameOfObject"@en }
?ob rdfs:label ?label .
它的优点是能够为?标签指定多个值。如果您使用的是Jena,那么还可以使用ParameterizedSparqlString,只需使用该模式即可

?ob rdfs:label ?label .
但是,当您具有所需的值时,替换?标签。有关参数化SparQLstrings的示例,请参阅至。

普通文本“NameOfLabel”与带有语言标记“NameOfLabel”@en的文本不同。如果

有效,那么我们也应该如此

?ob rdfs:label ?label .
filter ( ?label = "NameOfLabel"@en )      # (2)
如果要在不比较语言的情况下比较筛选器中的字符串内容,只需执行以下操作:

?ob rdfs:label ?label .
filter ( str(?label) = "NameOfLabel" )    # (3)
注意,(2)实际上不是很好的实践。根据精确值进行过滤没有多大意义,因为您可以只使用(1)。(3) 可以,因为您确实需要使用str函数。如果希望在运行时指定一些精确的值,并在查询中包含变量,还可以选择

values ?label { "NameOfObject"@en }
?ob rdfs:label ?label .
它的优点是能够为?标签指定多个值。如果您使用的是Jena,那么还可以使用ParameterizedSparqlString,只需使用该模式即可

?ob rdfs:label ?label .

但是,当您具有所需的值时,替换?标签。有关ParameterizedSparqlStrings的示例,请参阅至。

问题是:如果我运行您的#3查询,并在resultSet上使用hasNext()迭代器打印结果,则会出现get low:Empty RecordBuffer异常。我不确定“low:”是什么意思。(3) 应该有用,除非我误解了什么。你能显示你正在使用的代码,以及你得到的stacktrace异常吗?请注意,大多数结果集只能迭代一次,如果您打印它们,然后再次尝试迭代,则不会有任何可迭代的内容。Thx提前寻求帮助!看起来您在过去某个时候损坏了数据库,在创建数据库时没有使用事务,也没有调用TDB.sync(dataset)。问题是:如果我运行您的#3查询并在resultSet上使用hasNext()迭代器打印结果,我会得到get low:Empty RecordBuffer异常。我不确定“low:”是什么意思。(3) 应该有用,除非我误解了什么。你能显示你正在使用的代码,以及你得到的stacktrace异常吗?请注意,大多数结果集只能迭代一次,如果您打印它们,然后再次尝试迭代,则不会有任何可迭代的内容。Thx提前寻求帮助!看起来您在过去某个时候损坏了数据库,因为在创建数据库时没有使用事务,也没有调用TDB.sync(dataset)。感谢使用堆栈跟踪进行更新,但是发生这种情况的代码是什么?我用codeOK编辑了另一次,快速响应是代码看起来正常。您没有显示查询字符串,因此可能仍然存在错误,但这看起来应该是正常的。也许值得把它放到jena的邮件列表中,因为它可能是一个bug。不过,您希望能够提供一个完整的工作示例,因此重新创建一个最小数量的数据,以及加载数据集并运行查询的完整Java类。感谢使用堆栈跟踪进行的更新,但是发生这种情况的代码是什么?我用codeOK编辑了另一次,快速响应是代码看起来正常。您没有显示查询字符串,因此可能仍然存在错误,但这看起来应该是正常的。也许值得把它放到jena的邮件列表中,因为它可能是一个bug。不过,您希望能够提供一个完整的工作示例,因此需要重新创建一个最小数量的数据,以及加载数据集并运行查询的完整Java类。