Рассуждать с Fuseki, TDB и именованными графами?

Я передаю набор данных, содержащий 10-20 именованных графов из набора данных TDB в Fuseki 2. Я хотел бы использовать рассуждение, чтобы сделать вывод о моих данных. Поведение, которое я хотел бы видеть, состоит в том, что тройки, выведенные на каждом графике, должны появляться внутри этих графиков (хотя было бы хорошо, если бы тройки также появлялись на графике по умолчанию). Есть ли простой способ настроить это? Я не нашел ни одного примера конфигурации, который бы соответствовал тому, что я пытаюсь сделать.

Конфигурация, которую я попробовал, очень похожа на следующий стандартный пример.

Набор данных TDB -> 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, которое сохраняет постоянные именованные графы, делает выводы, а также допускает обновления.)

Заранее спасибо.

2 ответа

Я сталкиваюсь (или сталкивался) с теми же проблемами в моем коде, но у меня есть частичное решение. К сожалению, ссылка, приведенная в комментариях, на самом деле не помогла проблемам, с которыми я все еще сталкиваюсь, но это решает часть проблемы.

Окончательный вид данных, которые я вижу, представляет собой лишь очень маленькое подмножество данных (кажется, что все именованные графы отбрасываются где-то вдоль этого конвейера, и остается только крошечный граф по умолчанию). Использование 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), они не применяются "кросс-графическим" образом, и это проблема, которую я Я все еще сталкиваюсь.

Обычно, если вы добавляете механизм логического вывода к каждому графику, это должно работать, согласно сообщению Энди Сиборна, но в моем случае это не работает.

Надеюсь, это поможет, тем не менее.

Я сам сталкивался с этой проблемой много раз, но на самом деле я никогда не видел решения. Однако мне удалось выяснить это после прочтения этого в документации о "специальных именах графов" в наборах данных 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 ; 
.

Я использую аналогичную конфигурацию, и хотя я пытаюсь добавить именованный граф во время веб-интерфейса, я получаю ошибку

Result: failed with message "Read-only object file"

Кто-нибудь сталкивался с такой ошибкой? Я уже проверил все разрешения, установленные в событии местоположения DatasetTDB, для всех 777, но все еще имею ту же ошибку. Если я загружаю файл для графика по умолчанию, все в порядке.

Другие вопросы по тегам