Jena TDB,过滤器不能正常工作

时间:2014-07-28 16:38:18

标签: sparql jena tdb

我正在使用Jena TDB来存储文件中三元组的数据集。当我尝试使用filter向SPB发送SPARQL查询时出现问题。例如,以下查询有效:

select ?ob where {
  ?ob rdfs:label "NameOfLabel"@language .
}

但这不是:

select ?ob where {
  ?ob rdfs:label ?pr .
  filter( ?pr = "NameOfLabel" ) .
} 

此查询的目的是从?ob(忽略该语言)中查找"NameOfLabel"。我尝试了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)

编辑II:

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());
}

1 个答案:

答案 0 :(得分:4)

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

?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