在Jena OntMOdel中添加个人并访问它。异常ObjectFileStorage.read不可能是大对象

时间:2013-10-28 07:14:35

标签: sparql jena ontology owl tdb

我正在尝试将一些个体添加到我现有的Ontology(OntModel)中,目的是使用datatypeproperty范围内的运行时已知的特定数据类型为DatatypeProperty添加值/文字。我的OntModel由TDBStore支持,链接到数据集(因此对OntModel ins所做的任何更改都会反映回我的TDBStore / dataset)。根据以下代码添加个人:

Individual ind =oc.createIndividual(namespace+nameOfIndividual); // oc is OntClass object
Literal l = ontModel.createTypedLiteral("1230",dp.getRange().getURI()); //dp is a DatatypeProperty object
ind.addLiteral(dp,l);

当代码执行时,添加了文字和sparql查询:

"SELECT *  WHERE {  ?s :ABCConstant ?o }";  //:ABCConstant is the datatypeProperty for which the literal is added by the above code.

给我以下结果:

------------------------------------------------------------------------------------------------------------------------------------------------
| s                                                                                     | o                                                    |
================================================================================================================================================
| <http://www.semanticweb.org/ontologies/2012/10/Ontology.owl#individual1ABCDConstant>    | "10000.0"^^<http://www.w3.org/2001/XMLSchema#int> |
| <http://www.semanticweb.org/ontologies/2012/10/Ontology.owl#individual2ABCDConstant> | 1230                                                 |
------------------------------------------------------------------------------------------------------------------------------------------------

但是当我尝试在第二次运行中使用相同的查询时(这次没有创建任何个人),当程序试图显示/访问结果时,我得到以下异常:

Exception in thread "main" com.hp.hpl.jena.tdb.base.file.FileException: ObjectFileStorage.read[nodes](181624)[filesize=248062][file.size()=248062]: Impossibly large object : 1634628966 bytes > filesize-(loc+SizeOfInt)=66434
    at com.hp.hpl.jena.tdb.base.objectfile.ObjectFileStorage.read(ObjectFileStorage.java:346)
    at com.hp.hpl.jena.tdb.lib.NodeLib.fetchDecode(NodeLib.java:78)
    at com.hp.hpl.jena.tdb.nodetable.NodeTableNative.readNodeFromTable(NodeTableNative.java:178)
    at com.hp.hpl.jena.tdb.nodetable.NodeTableNative._retrieveNodeByNodeId(NodeTableNative.java:103)
    at com.hp.hpl.jena.tdb.nodetable.NodeTableNative.getNodeForNodeId(NodeTableNative.java:74)
    at com.hp.hpl.jena.tdb.nodetable.NodeTableCache._retrieveNodeByNodeId(NodeTableCache.java:103)
    at com.hp.hpl.jena.tdb.nodetable.NodeTableCache.getNodeForNodeId(NodeTableCache.java:74)
    at com.hp.hpl.jena.tdb.nodetable.NodeTableWrapper.getNodeForNodeId(NodeTableWrapper.java:55)
    at com.hp.hpl.jena.tdb.nodetable.NodeTableInline.getNodeForNodeId(NodeTableInline.java:67)
    at com.hp.hpl.jena.tdb.lib.TupleLib.triple(TupleLib.java:126)
    at com.hp.hpl.jena.tdb.lib.TupleLib.triple(TupleLib.java:114)
    at com.hp.hpl.jena.tdb.lib.TupleLib.access$000(TupleLib.java:45)
    at com.hp.hpl.jena.tdb.lib.TupleLib$3.convert(TupleLib.java:76)
    at com.hp.hpl.jena.tdb.lib.TupleLib$3.convert(TupleLib.java:72)
    at org.apache.jena.atlas.iterator.Iter$4.next(Iter.java:317)
    at org.apache.jena.atlas.iterator.Iter$4.next(Iter.java:317)
    at org.apache.jena.atlas.iterator.Iter$4.next(Iter.java:317)
    at org.apache.jena.atlas.iterator.Iter.next(Iter.java:915)
    at com.hp.hpl.jena.util.iterator.WrappedIterator.next(WrappedIterator.java:94)
    at com.hp.hpl.jena.util.iterator.WrappedIterator.next(WrappedIterator.java:94)
    at com.hp.hpl.jena.util.iterator.FilterIterator.hasNext(FilterIterator.java:55)
    at com.hp.hpl.jena.graph.compose.CompositionBase$2.hasNext(CompositionBase.java:94)
    at com.hp.hpl.jena.util.iterator.NiceIterator$1.hasNext(NiceIterator.java:103)
    at com.hp.hpl.jena.util.iterator.WrappedIterator.hasNext(WrappedIterator.java:90)
    at com.hp.hpl.jena.sparql.engine.iterator.QueryIterTriplePattern$TripleMapper.hasNextBinding(QueryIterTriplePattern.java:151)
    at com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:112)
    at com.hp.hpl.jena.sparql.engine.iterator.QueryIterRepeatApply.hasNextBinding(QueryIterRepeatApply.java:81)
    at com.hp.hpl.jena.sparql.engine.iterator.QueryIteratorBase.hasNext(QueryIteratorBase.java:112)
    at com.hp.hpl.jena.sparql.engine.iterator.QueryIterBlockTriples.hasNextBinding(QueryIterBlockTriples.java:64)
    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)
    at com.hp.hpl.jena.sparql.resultset.ResultSetMem.<init>(ResultSetMem.java:97)
    at com.hp.hpl.jena.query.ResultSetFactory.makeRewindable(ResultSetFactory.java:420)
    at com.hp.hpl.jena.sparql.resultset.TextOutput.write(TextOutput.java:149)
    at com.hp.hpl.jena.sparql.resultset.TextOutput.write(TextOutput.java:132)
    at com.hp.hpl.jena.sparql.resultset.TextOutput.write(TextOutput.java:120)
    at com.hp.hpl.jena.sparql.resultset.TextOutput.format(TextOutput.java:67)
    at com.hp.hpl.jena.query.ResultSetFormatter.out(ResultSetFormatter.java:122)
    at com.hp.hpl.jena.query.ResultSetFormatter.out(ResultSetFormatter.java:74)
    at com.hp.hpl.jena.query.ResultSetFormatter.out(ResultSetFormatter.java:65)
    at senseXploreApi.SparqlQuery.sparqlQuery(SparqlQuery.java:82)
    at senseXploreApi.TryMain.main(TryMain.java:39)

注意:查看添加的个人的其他查询执行正常。 但查询如: “SELECT * WHERE {?s?o 1230}” 导致同样的错误。

还查询如下: “SELECT * WHERE {?s?o 10000.0}” 要么 “SELECT * WHERE {?s?o 10000}” 不要给出任何错误但是不返回任何结果。

使用以下语句添加文字10000:

ind.addLiteral(opp,new Integer(10000));

请帮帮我!!我错在哪里..用于创建个人的程序是错误的吗?如是!那么在运行时添加具有特定数据类型的文字的其他可能方法是什么呢?

1 个答案:

答案 0 :(得分:3)

Impossibly Large Object消息表示您的TDB数据库已被(部分)损坏,特别是在数据库内部标识符与原始RDF术语之间映射的节点表的一部分已损坏。任何触及节点表那部分的查询都会看到此错误,其他查询可能仍然没有问题。

恢复数据库的唯一方法是从原始数据重建数据库,一旦发生损坏就无法修复它。

腐败可能以各种方式发生,其中最常见的是:

  • 以非交易方式访问TDB,并且在进行更改后未能在数据集上调用sync()(或者在您的示例中更有可能在制作后close()上无法调用Model改变)
  • 让多个JVM同时访问相同的TDB数据集,如果您的应用程序需要使用Fuseki这样的服务器来集中访问数据库。

有关如何以事务方式使用TDB的信息,请参阅TDB Transactions,或者如果需要同时向多个JVM公开TDB数据库,请参阅Fuseki文档。