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

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


person Johan Nystrom    schedule 16.02.2016    source источник
comment
Привет, Йохан, у меня такой же вопрос, поэтому я задал его в списке рассылки - ›mail-archives.apache.org/mod_mbox/jena-users/201603.mbox/   -  person Maksim Kolchin    schedule 10.03.2016
comment
@MaximKolchin Отлично. Большое спасибо.   -  person Johan Nystrom    schedule 11.03.2016


Ответы (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 включен), они не применяются «перекрестным графом», и это проблема I все еще сталкиваюсь.

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

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

person RdNetwork    schedule 29.06.2016

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