jena – 使用Fuseki,TDB和命名图进行推理?

我正在为Fuseki 2中的TDB数据集提供包含10-20个命名图的数据集.

我想用推理器来推断我的数据.我希望看到的行为是每个图形中推断的三元组应该出现在这些图形中(尽管如果三元组也出现在默认图形中也会没问题).

有一种简单的配置方法吗?我没有找到任何符合我要做的配置示例.

我尝试过的配置与以下标准示例非常相似.

DatasetTDB – > GraphTDB – > InfModel – > RDFDataset

我看到的数据的最终视图只是数据的一个非常小的子集(似乎所有命名的图形都沿着这个管道被丢弃,只剩下很小的默认图形).
使用tdb:unionDefaultGraph似乎对此没有影响.

prefix :        <#> .
@prefix fuseki:  <http://jena.apache.org/fuseki#> .
@prefix rdf:     <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .

@prefix rdfs:    <http://www.w3.org/2000/01/rdf-schema#> .
@prefix tdb:     <http://jena.hpl.hp.com/2008/tdb#> .
@prefix ja:      <http://jena.hpl.hp.com/2005/11/Assembler#> .

# Example of a data service with SPARQL query and update on an 
# inference model.  Data is taken from TDB.

## ---------------------------------------------------------------
## Service with only SPARQL query on an inference model.
## Inference model base data is in TDB.

<#service2>  rdf:type fuseki:Service ;
fuseki:name              "inf" ;             # http://host/inf
fuseki:serviceQuery      "sparql" ;          # SPARQL query service
fuseki:serviceUpdate     "update" ;
fuseki:dataset           <#dataset> ;
.

<#dataset> rdf:type       ja:RDFDataset ;
ja:defaultGraph       <#model_inf> ;
 .

<#model_inf> a ja:InfModel ;
 ja:baseModel <#tdbGraph> ;
 ja:reasoner [
     ja:reasonerURL <http://jena.hpl.hp.com/2003/OWLFBRuleReasoner>
 ] .

## Base data in TDB.
<#tdbDataset> rdf:type tdb:DatasetTDB ;
tdb:location "DB" ;
# If the unionDefaultGraph is used, then the "update" service should be removed.
# tdb:unionDefaultGraph true ;
.

<#tdbGraph> rdf:type tdb:GraphTDB ;
tdb:dataset <#tdbDataset> .
</code>

有没有人对此有任何想法?

此外,如果有办法使数据集可写,奖励积分. (在某种程度上,我正在尝试做的是接近Owlim / GraphDB的默认行为,它保持持久的命名图,进行推理,并允许更新.)

提前致谢.

最佳答案 我在我的代码上面临(或面临)同样的问题,但我有一个部分解决方案.不幸的是,评论中提供的链接并没有真正帮助我仍然面临的问题,但这回答了部分问题.

The final view of the data I see is only a very tiny subset of the
data (it appears that all the named graphs are dropped somewhere along
this pipeline, and only the tiny default graph is left). Using
tdb:unionDefaultGraph seems to have no effect on this.

我找到的解决方法是在配置文件中明确“注册”您的命名图.我真的不知道它是否是最好的方式(并没有找到任何文档或示例的确切上下文).我的设置上的一个工作示例(Fuseki 2.4):

[usual configuration start]

# TDB Dataset
:tdb_dataset_readwrite
        a             tdb:DatasetTDB ;
        tdb:unionDefaultGraph true ; 
        #if you want all data to available in the default graph
        #without 'FROM-NAMing them' in the SPARQL query
        tdb:location  "your/dataset/path" .

# Underlying RDF Dataset
<#dataset> 
    rdf:type    ja:RDFDataset ;
    ja:defaultGraph <#model> ;
    ja:namedGraph [
        ja:graphName    <your/graph/URI> ;
        ja:graph        <#graphVar> 
    ] ;

    [repeat for other named graphs]
    .      


######
# Default Model : Inference rules (OWL, here)
<#model> a ja:InfModel;
    ja:baseModel <#tdbGraph>;
    ja:reasoner
    [ ja:reasonerURL 
        <http://jena.hpl.hp.com/2003/OWLFBRuleReasoner>
    ]
    .

# Graph for the default Model
<#tdbGraph> rdf:type tdb:GraphTDB;
    tdb:dataset :tdb_dataset_readwrite .

######
# Named Graph
<#graphVar> rdf:type tdb:GraphTDB ;
    tdb:dataset :tdb_dataset_readwrite ;
    tdb:graphName <your/graph/URI> 
    .

然后,您可以运行像这样的查询

[prefixes]

SELECT ?graph ?predicate ?object
WHERE {
  GRAPH ?graph {[a specific entity identifier] ?predicate ?object}
}
LIMIT 50

它将显示(在本例中)属性和值,以及它们被找到的源图.

但是:在这个例子中,即使默认图表应该导入推理规则(应该全局应用,特别是因为启用了unionDefaultGraph参数),它们不会以“交叉图”的方式应用,这就是问题我我还在面对.

通常情况下,如果你将推理引擎添加到每个图表中,根据Andy Seaborne的帖子here,这应该可行,但它在我的情况下不起作用.

希望这会有所帮助.

点赞