【发布时间】:2014-07-28 16:38:17
【问题描述】:
我正在使用 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) 以及其他一些东西,但这些都没有奏效。我该怎么做?
更新(根据回答)
当我尝试使用filter( 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());
}
【问题讨论】:
-
感谢更新堆栈跟踪,但是发生这种情况的代码是什么?
-
我用代码编辑了另一个时间
-
OK,快速反应是代码看起来OK。您没有显示查询字符串,因此那里可能仍然有问题,但是这个 看起来 应该没问题。将它带到耶拿邮件列表可能是值得的,因为它可能是一个错误。不过,您将希望能够在那里提供一个完整的工作示例,因此重新创建最少量的数据,以及加载数据集并运行查询的完整 Java 类。