5

我正在提供一个数据集,其中包含来自 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 的默认行为,它保持持久的命名图,进行推理,还允许更新。)

提前致谢。

4

2 回答 2

3

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

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

我为此找到的解决方法是在配置文件中显式“注册”您的命名图。我真的不知道这是否是最好的方法(并且没有找到任何关于这个确切上下文的文档或示例)。我的设置(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 在此处的帖子,但在我的情况下它不起作用。

尽管如此,希望这会有所帮助。

于 2016-06-29T07:03:56.410 回答
1

我自己多次遇到过这个问题,但实际上我从未见过解决方案。但是,在阅读了有关 TDB 数据集中“特殊图形名称”的文档后,我设法弄清楚了这一点。据我了解,在汇编文件中为 TDB 数据集设置联合默认图只会更改查询该特定数据集时返回的内容。但是,有一个特殊的图名可以用来引用联合图:<urn:x-arq:UnionGraph>. 因此,只需创建GraphTDB、引用 TDB 数据集并将其指向这个特殊的图。

下面的配置文件执行问题中要求的操作:推理在默认联合图上执行,结果在 TDB 数据集中作为可写服务公开。(请注意,推理服务在重新加载之前不会看到数据集中的任何变化,因为推理都是在内存中完成的)。

@prefix :      <http://base/#> .
@prefix tdb:   <http://jena.hpl.hp.com/2008/tdb#> .
@prefix rdf:   <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix ja:    <http://jena.hpl.hp.com/2005/11/Assembler#> .
@prefix rdfs:  <http://www.w3.org/2000/01/rdf-schema#> .
@prefix fuseki: <http://jena.apache.org/fuseki#> .

# TDB
tdb:DatasetTDB  rdfs:subClassOf  ja:RDFDataset .
tdb:GraphTDB    rdfs:subClassOf  ja:Model .


# Service 1: Dataset endpoint (no reasoning)
:dataService a fuseki:Service ;
  fuseki:name           "tdbEnpoint" ;
  fuseki:serviceQuery   "sparql", "query" ;
  fuseki:serviceUpdate  "update" ;
  fuseki:dataset        :tdbDataset ;
.

# Service 2: Reasoning endpoint
:reasoningService a fuseki:Service ;
  fuseki:dataset                 :infDataset ;
  fuseki:name                    "reasoningEndpoint" ;
  fuseki:serviceQuery            "query", "sparql" ;
  fuseki:serviceReadGraphStore   "get" ;
.

# Inference dataset
:infDataset rdf:type ja:RDFDataset ;
            ja:defaultGraph :infModel ;
.

# Inference model
:infModel a ja:InfModel ;
           ja:baseModel :g ;

           ja:reasoner [
              ja:reasonerURL <http://jena.hpl.hp.com/2003/OWLFBRuleReasoner> ;
           ] ;
.

# Intermediate graph referencing the default union graph
:g rdf:type tdb:GraphTDB ;
   tdb:dataset :tdbDataset ;
   tdb:graphName <urn:x-arq:UnionGraph> ;
.

# The location of the TDB dataset
:tdbDataset rdf:type tdb:DatasetTDB ;
            tdb:location "/fuseki/databases/db" ;
            tdb:unionDefaultGraph true ; 
.
于 2017-03-19T23:28:13.797 回答