Sparql Jena TDB原因后再更新

Sparql Jena TDB原因后再更新,sparql,jena,tdb,jena-rules,Sparql,Jena,Tdb,Jena Rules,我正在使用Jena,我想将新的本体更新到我的tdb中。 例如 我的本体中有100行,在我添加一些规则并运行reasoner之后,现在有105行。 我需要更新tdb中的这5行。 我怎样才能做到这一点 我试着用谷歌搜索它,我发现了两种方法。一个是使用sparql进行更新,另一个是截断tdb并将新模型添加到其中 还有其他更好的解决办法吗 谢谢 -- 代码 同样,我的问题是如何处理tdb的新“infmodel”。 我只想更新它的新事实 这是我从tdb获取模型的方法 Model tdb_write_ret

我正在使用Jena,我想将新的本体更新到我的tdb中。 例如 我的本体中有100行,在我添加一些规则并运行reasoner之后,现在有105行。 我需要更新tdb中的这5行。 我怎样才能做到这一点

我试着用谷歌搜索它,我发现了两种方法。一个是使用sparql进行更新,另一个是截断tdb并将新模型添加到其中

还有其他更好的解决办法吗

谢谢

--

代码

同样,我的问题是如何处理tdb的新“infmodel”。 我只想更新它的新事实

这是我从tdb获取模型的方法

Model tdb_write_return() {
    String directory = "./tdb";
    Dataset dataset = TDBFactory.createDataset(directory);

    dataset.begin(ReadWrite.WRITE);
    String ns = "http://www.darrell.com.tw/ontologies/";

    Model model = dataset.getNamedModel(ns);
    dataset.commit();
    dataset.end();
    dataset.close();

    return model;
}

请注意
TDBFactory
获取的
Datset
的生存期应长于从中获取的
模型
对象。如果对该数据集调用
Dataset.close()
,则与返回的模型的交互可能会突然出现错误

实现扣除额

关于您的问题,如果希望保留推断的三元组,则需要将它们添加回基础模型。这可以利用现有的图形,而不是替换任何东西

final String directory=“./tdb”;
最后一个字符串ns=”http://www.darrell.com.tw/ontologies/";
最终数据集Dataset=TDBFactory.createDataset(目录);
dataset.begin(ReadWrite.WRITE);
试一试{
Model Model=dataset.getNamedModel(ns);
final Reasoner Reasoner=new GenericRuleReasoner(Rule.rulesFromURL(“文件:./rules/act.Rule”);
final InfModel InfModel=ModelFactory.createInfModel(reasoner,m);
infModel.prepare()
model.add(infModel.getDeclarationsModel());/#1
提交();
}
捕获(最终异常e){
dataset.abort();
}
最后{
dataset.end();
}
在上面的示例中,带有注释的行
#1
获取(向前)扣除的结果,并将其插入到基础模型中。要获得所有扣减,您可以执行以下操作:

model.add(infModel);
P>推理者可以考虑新的三元组,并尝试进行新的演绎,但尝试推理的结果应该是NO-op.< 解释

如果将
infModel
添加到基础模型,则尝试将原始模型的并集、反向推理和正向推理全部添加到原始模型。你在评论中提到了这一点。为了澄清,由于RDF的集合语义,尝试添加已经存在的三元组不会导致对数据的任何更改。在RDF中,每个四元组/三元组(或行,考虑到关系类比)都是唯一的


如果将
infModel.getDeclarationsModel()
添加到原始模型中,所有正向链接推断都会插入回图形中。一般来说,这至少比添加
infModel
要有效一点,但如果依赖反向链接推断,则不适用。

您能否澄清一下您实际在做什么?TDB是一个RDF三元组存储,所以我假设当你说“行”时,你指的是三元组。如果您在Java代码之外,那么使用SPARQL是更新三元组存储的最自然的方式,但是如果您正在编写Java代码,那么您可以轻松地检索数据集中命名图的模型,并使用Jena向它们添加语句。是的,您回答了我的问题。但问题是,在使用推理机之后。我得到了一个模型,其中包含我的旧模型和新的三元组。我对如何将Infmodel放入tdb并进行更新感到困惑,因为它包含了我的旧模型。不仅仅是新海龟。谢谢。请出示一些代码。到目前为止你做了什么?什么东西没有按你预期的方式工作?一个TDB数据集可以包含多个图形,但不清楚您是要覆盖一个图形,还是只是添加到其中,或者做什么。请说明你目前正在做什么,还有什么不可行。只需更新代码,谢谢你的回复谢谢!这里有一个小问题,当谈论正向推理时。它是这样的x->y,反向链接推理就像x。前者是根据基本模型的内容以及其他规则的结果进行评估的。后者在执行查询时(或当您要求模型列出语句时)进行计算。混合规则(x->)(另一个问题是,infModel.getDeclarationsModel()在genericRule上工作。但是在owl推理机上很奇怪。是否有更好的解决方案使用owl推理机并获取模型的新部分?是否使用前向链接owl推理机/规则集?默认的owl推理机是混合推理机(因此
getDeclarationsModel
将只提供规则集的前向部分)。
model.add(infModel);