【问题标题】:Query multiple TDB Datasets查询多个 TDB 数据集
【发布时间】:2014-09-30 13:21:53
【问题描述】:

使用:jena-fuseki-1.1.0、apache-jena-2.12.0

我想要达到的目标和我目前的状态:

我正在尝试使用 dbpedia Persondata(英语和德语)、跨语言链接、图像和维基百科文章链接设置本地 jena-fuseki 服务器 从 wiki.dbpedia.org/Downloads2014 下载为 .nt 文件。我想对它们运行下面的 SPAQRL-Query 并获得与 dbpedia.org/sparql 相同的结果。这个查询应该给我所有在德国斯图加特出生的人,包括他们的姓名、出生日期、英语和德语描述文本、维基百科链接、图片链接和简短描述。

PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>
PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX : <http://dbpedia.org/resource/>
PREFIX dbpedia2: <http://dbpedia.org/property/>
PREFIX dbpedia: <http://dbpedia.org/>
PREFIX skos: <http://www.w3.org/2004/02/skos/core#>
PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT ?name ?birth ?description_en ?description_de ?wiki ?description ?pic
WHERE {
   ?person dbo:birthPlace :Stuttgart .
   ?person dbo:birthDate ?birth .
   ?person foaf:name ?name .
   OPTIONAL{
      ?person dc:description ?description .
      FILTER (LANG(?description) = 'en') .
   }
   OPTIONAL{
      ?person foaf:isPrimaryTopicOf ?wiki .
   }
   FILTER NOT EXISTS{
      ?person dbo:deathDate ?death .
   }
   OPTIONAL {
      ?person rdfs:comment ?description_en .
      FILTER (LANG(?description_en) = 'en') .
   }
   OPTIONAL {
      ?person rdfs:comment ?description_de .
      FILTER (LANG(?description_de) = 'de') .
   }
   OPTIONAL {
      ?person dbo:thumbnail ?pic
   }
}
ORDER BY ?name

我在 dbpedia.org/sparql 上得到的信息:

第一行:

"Abdulsamed Akin"@en 1991-07-17+02:00 "Abdulsamed Akin (born July 17, 1991) is a Turkish-German footballer who plays for Stuttgarter Kickers."@en "Abdulsamed Akin (* 17. Juli 1991 in Stuttgart) ist ein deutscher Fußballspieler türkischer Abstammung."@de http://en.wikipedia.org/wiki/Abdulsamed_Akin "Footballer"@en http://commons.wikimedia.org/wiki/Special:FilePath/Abdulsamed_Akin.jpg?width=300

我在 fuseki 上得到了什么:

第一行:

"Abdulsamed Akin"@en "1991-07-17"^^&lt;http://www.w3.org/2001/XMLSchema#date&gt; [empty] [empty] [empty] [empty] "Footballer"@en [empty]

如您所见,我的本地查询中缺少描述文本以及指向维基百科和图片的链接。

不同的属性位于不同的 TDB 数据集中,因为来自 DBpedia 的 .nt 文件是分开的。 ?name、?birth 和 ?description 位于“Persondata”的 TDB 中, “链接到维基百科文章”中的 ?wiki 和“图片”中的 ?pic。

所以我需要查询不同的 TDB 数据源或以某种方式组合它们。

到目前为止我做了什么:

下载 .nt 文件并在其上使用 tdbloader 后,我得到了五个 tdb 文件夹,我将它们放在本地 fuseki 中。 然后我把这两个配置放在一起,目的是结合 tdb-datasets,所以我可以进行上述查询,但它们都不起作用:

第一:

@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#> .

[] rdf:type fuseki:Server ;
   fuseki:services (
     <#service1>
   ) .

# TDB
[] ja:loadClass "com.hp.hpl.jena.tdb.TDB" .
tdb:DatasetTDB  rdfs:subClassOf  ja:RDFDataset .
tdb:GraphTDB    rdfs:subClassOf  ja:Model .

<#service1> rdf:type fuseki:Service ;
    # URI of the dataset -- http://localhost:3030/ds
    fuseki:name                        "ds" ; 
    fuseki:serviceQuery                "sparql" ;   
    fuseki:serviceReadGraphStore       "data" ;
    fuseki:serviceReadGraphStore       "get" ;
    fuseki:dataset                     <#dataset> ;
    .

## ----------------------------------
## dataset for default graph
<#dataset> rdf:type      ja:RDFDataset ;
     ja:defaultGraph <#dbenGraph> ;
     #ja:namedGraph
     #   [ ja:graphName      <http://localhost:3030/dbenGraph> ;
     #     ja:graph          <#dbenGraph> ] ;
     ja:namedGraph
        [ ja:graphName       <http://localhost:3030/dbdeGraph> ;
          ja:graph           <#dbdeGraph> ] ;
     ja:namedGraph
        [ ja:graphName       <http://localhost:3030/dbinterGraph> ;
          ja:graph           <#dbinterGraph> ] ;
     ja:namedGraph
        [ ja:graphName       <http://localhost:3030/dbpicGraph> ;
          ja:graph           <#dbpicGraph> ] ;
     ja:namedGraph
        [ ja:graphName       <http://localhost:3030/dbwikiGraph> ;
          ja:graph           <#dbwikiGraph> ] ;
     .

## ----------------------------------
## the graph's  
<#dbenGraph> rdf:type tdb:GraphTDB ;
    tdb:dataset <#dbpedia_en> ;
    tdb:unionDefaultGraph   true ;
    .

<#dbdeGraph> rdf:type tdb:GraphTDB ;
    tdb:dataset <#dbpedia_de> ;
    tdb:unionDefaultGraph   true ;
    .

<#dbinterGraph> rdf:type tdb:GraphTDB ;
    tdb:dataset <#dbpedia_inter> ;
    tdb:unionDefaultGraph   true ;
    .

<#dbpicGraph> rdf:type tdb:GraphTDB ;
    tdb:dataset <#dbpedia_wiki> ;
    tdb:unionDefaultGraph   true ;
    .

<#dbwikiGraph> rdf:type tdb:GraphTDB ;
    tdb:dataset <#dbpedia_inter> ;
    tdb:unionDefaultGraph   true ;
    .

## DB of persons in Englisch
<#dbpedia_en> rdf:type      tdb:DatasetTDB ;
    tdb:location            "db" ;
    tdb:unionDefaultGraph   true ;
    .

## DB of persons in German
<#dbpedia_de> rdf:type      tdb:DatasetTDB ;
    tdb:location            "dbde" ;
    tdb:unionDefaultGraph   true ;
    .

## DB of persons inter-language-link
<#dbpedia_inter> rdf:type      tdb:DatasetTDB ;
    tdb:location               "dbinter" ;
    tdb:unionDefaultGraph      true ;
    .

## DB of image-links
<#dbpedia_pic> rdf:type      tdb:DatasetTDB ;
    tdb:location "dbpic" ;
    tdb:unionDefaultGraph true ;
    .

## DB of wiki-links
<#dbpedia_wiki> rdf:type      tdb:DatasetTDB ;
    tdb:location "dbwiki" ;
    tdb:unionDefaultGraph true ;
    .

第二:

@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#> .

[] rdf:type fuseki:Server ;

   fuseki:services (
     <#service1>
   ) .

# TDB
[] ja:loadClass "com.hp.hpl.jena.tdb.TDB" .
tdb:DatasetTDB  rdfs:subClassOf  ja:RDFDataset .
tdb:GraphTDB    rdfs:subClassOf  ja:Model .

## ---------------------------------------------------------------
## Services.

<#service1> rdf:type fuseki:Service ;
    # URI of the dataset -- http://localhost:3030/ds
    fuseki:name                        "ds" ; 
    fuseki:serviceQuery                "sparql" ;   
    fuseki:serviceReadGraphStore       "data" ;
    fuseki:serviceReadGraphStore       "get" ;
    fuseki:dataset                     <#dataset> ;
    .

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

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

<#dbenGraph> rdf:type tdb:GraphTDB ;
    tdb:dataset <#dbpedia_en> ;
    tdb:unionDefaultGraph   true ;
    .   

## DB of Persons in Englisch
<#dbpedia_en> rdf:type      tdb:DatasetTDB ;
    tdb:location            "db" ;
    tdb:unionDefaultGraph   true ;
    .

## DB of Persons in German
<#dbpedia_de> rdf:type      tdb:DatasetTDB ;
    tdb:location            "dbde" ;
    tdb:unionDefaultGraph   true ;
    .

## DB of Persons inter-language-link
<#dbpedia_inter> rdf:type      tdb:DatasetTDB ;
    tdb:location               "dbinter" ;
    tdb:unionDefaultGraph      true ;
    .

## DB von Resource auf Image
<#dbpedia_pic> rdf:type      tdb:DatasetTDB ;
    tdb:location "dbpic" ;
    tdb:unionDefaultGraph true ;
    .

## DB von Resource auf Wiki
<#dbpedia_wiki> rdf:type      tdb:DatasetTDB ;
    tdb:location "dbwiki" ;
    tdb:unionDefaultGraph true ;
    .

那么为什么本地查询缺少属性呢?我是否配置或查询 fuseki 错误?查询中缺少他们的东西吗? 还有其他方法可以实现我想要的吗?

我希望能清楚地传达我的需求,如果没有,请随时询问!

【问题讨论】:

  • 顺便说一句,使用langMatches(lang(?x),'en') 进行过滤通常比使用lang(?x) = 'en' 更好,因为它可以正确处理复杂的语言标签(例如,'en-us')。

标签: sparql jena dbpedia tdb fuseki


【解决方案1】:

绝对没有必要将每个单独的文件加载到单独的 TDB 数据集中,除非您出于某种原因确实希望将数据分开。

从您的问题描述来看,您似乎希望将所有数据组合在一起,因此您最好只创建一个 TDB 数据集并对其进行查询。 tdbloader 非常乐意让您将多个文件加载到单个 TDB 数据库中。

至于为什么您当前的设置不起作用,是因为您只将您的服务连接到一个 TDB 数据集。

【讨论】:

  • 是的,没错,我不需要将它们分开,但我不知道它们可以放在一个 tdb 中,来自多个 .nt 文件。我现在正在尝试tdbloader -loc=location file1 file2 file3.. 这是 tdbloader 的正确用法吗? (这需要我等一下,我想我在等待时问)
  • 可能有很多理由使用单独的文件。最明显的是,不同的数据集可能会以不同的时间间隔更新——有些稳定,有些则不稳定。加载到 TDB 中可能会很耗时,因此将易失性和易失性数据分离到单独的数据集中是有意义的。各种其他原因表明了自己。也许您为了安全而运行单独的服务器,并且某些数据集根本不托管在外部可访问的站点上。
【解决方案2】:

我曾在 joseki 工作过,但由于某种原因,fuseki 让我很伤心。

1 - 有多个 TDB 数据集

:ds1 a tdb:DatasetTDB ; tdb:location "dir1" .
:ds2 a tdb:DatasetTDB ; tdb:location "dir2" .

2 - 制作多个图表

:g1 a tdb:GraphTDB ; tdb:dataset :ds1 ; tdb:graphName foo:the-dataset .
:g2 a tdb:GraphTDB ; tdb:dataset :ds2 ; tdb:graphName bar:the-dataset .

3 - 制作联合图

:g a ja:UnionModel
  ; ja:subModel :g1
  ; ja:subModel :g2

4 - 在您的数据集中,将此联合图用作默认图

:dataset a ja:RDFDataset
 ; ja:defaultGraph :g
 ; ja:namedGraph [ ja:graphName foo:the-graph ; ja:graph :g1 ]
 ; ja:namedGraph [ ja:graphName bar:the-graph ; ja:graph :g2 ]
]

您的查询针对默认值运行,但您也可以使用 sparql 子句专门针对任一图进行查询

WHERE { GRAPH foo:the-graph { ?S ?p ?o } }

【讨论】:

  • 您是否让上述示例在 Fuseki 中工作?我喜欢如果您不知道图表名称,您可以通过默认图表查询所有内容,但是如果您确实知道图表名称,则可以使用特定的名称。我还想知道如果您同时选择默认图和命名图会发生什么......它是否会返回重复的结果,因为默认图包含命名图?
  • 我从未启动并运行 Fuseki。我们所拥有的工作 - 虽然我看到它目前没有运行。顺便说一句 - 为了限制随意选择查询试图吸收我们数据库的全部内容,我们的默认图表是一组静态术语,描述我们拥有哪些图表以及其中的内容。也就是说,我们的默认图是服务器元数据。
  • 谢谢!通过创建我自己的AssemblerBase,我设法让这个在 Apache Jena/Fuseki 中工作。我使用MultiUnion 将三个命名图组合成一个默认图。
猜你喜欢
  • 2015-08-23
  • 2012-10-24
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 2020-06-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多