【问题标题】:Jena TDB , filters don't workJena TDB,过滤器不起作用
【发布时间】: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(忽略语言)。我试过regexstr(?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 类。

标签: sparql jena tdb


【解决方案1】:

普通文字“NameOfLabel”与带有语言标签“NameOfLabel”@en 的文字相同。如果

?ob rdfs:label "NameOfLabel"@en           # (1)

有效,那么应该

?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 .

它的优点是可以为 ?label 指定多个值。如果您使用的是 Jena,您也可以使用 ParameterizedSparqlString 并只使用模式

?ob rdfs:label ?label .

但是当你有你想要的值时替换 ?label 。有关 ParameterizedSparqlStrings 的示例,请参阅 my answerget latitude and longitude of a place dbpedia

【讨论】:

  • 问题是:如果我运行你的#3 查询并在 resultSet 上使用 hasNext() 迭代器打印结果,我会得到 get low: Empty RecordBuffer 异常。
  • 我不确定您所说的“低:”是什么意思。 (3)应该工作,除非我误解了什么。你能展示你正在使用的代码,以及你得到的堆栈跟踪异常吗?请注意,大多数结果集只能迭代一次 - 如果您打印它们然后尝试再次迭代,则不会有任何东西可以迭代。
  • 我在编辑中编写堆栈跟踪。提前谢谢帮助!
  • 看起来您在过去的某个时间由于在创建数据库时不使用事务并且不调用 TDB.sync(dataset) 而损坏了数据库。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多