Sparql 查询多个TDB数据集

Sparql 查询多个TDB数据集,sparql,jena,dbpedia,tdb,fuseki,Sparql,Jena,Dbpedia,Tdb,Fuseki,使用:jena-fuseki-1.1.0、apache-jena-2.12.0 我想要实现的目标和当前状态: 我正在尝试建立一个本地jena fuseki服务器,其中包含dbpedia Persondata(英语和德语)、跨语言链接、图像和指向Wikipedia文章的链接 从wiki.dbpedia.org/Downloads2014下载为.nt文件。我想对它们运行下面的SPAQRL查询,并获得与dbpedia.org/sparql相同的结果。这个查询应该给我所有出生在德国斯图加特的在世人士的姓

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

我想要实现的目标和当前状态:

我正在尝试建立一个本地jena fuseki服务器,其中包含dbpedia Persondata(英语和德语)、跨语言链接、图像和指向Wikipedia文章的链接 从wiki.dbpedia.org/Downloads2014下载为.nt文件。我想对它们运行下面的SPAQRL查询,并获得与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
第二:

@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:。
@前缀rdf:。
@前缀rdfs:。
@前缀tdb:。
@前缀ja:。
[]rdf:type fuseki:Server;
fuseki:服务(
) .
#TDB
[]ja:loadClass“com.hp.hpl.jena.tdb.tdb”。
tdb:datasetdb-rdfs:ja的子类:RDFDataset。
tdb:GraphTDB-rdfs:ja的子类:Model。
## ---------------------------------------------------------------
##服务。
rdf:fuseki类型:服务;
#数据集的URI--http://localhost:3030/ds
fuseki:名称“ds”;
fuseki:serviceQuery“sparql”;
fuseki:serviceReadGraphStore“数据”;
fuseki:serviceReadGraphStore“获取”;
fuseki:数据集;
.
rdf:ja型:RDFDataset;
ja:defaultGraph;
.
a:ja模型;
ja:基本模型;
ja:推理机[
ja:ReasureUrl
] 
.
rdf:类型tdb:图形DB;
tdb:数据集;
tdb:unionDefaultGraph true;
.   
##英语人名
rdf:类型tdb:数据集DB;
tdb:位置“db”;
tdb:unionDefaultGraph true;
.
##德文人员数据库
rdf:类型tdb:数据集DB;
tdb:位置“dbde”;
tdb:unionDefaultGraph true;
.
##人际语言链接数据库
rdf:类型tdb:数据集DB;
tdb:位置“dbinter”;
tdb:unionDefaultGraph true;
.
##DB von资源auf图像
rdf:类型tdb:数据集DB;
tdb:位置“dbpic”;
tdb:unionDefaultGraph true;
.
##DB von资源auf Wiki
rdf:类型tdb:数据集DB;
tdb:位置“dbwiki”;
tdb:unionDefaultGraph true;
.
那么为什么本地查询缺少属性呢?我是否配置或查询fuseki错误?他们的问题中缺少什么吗? 有没有其他方法可以实现我想要的


我希望能清楚地表达我的需求,如果不能,请随意提问

绝对不需要将每个单独的文件加载到单独的TDB数据集中,除非您出于某种原因确实希望将数据保持单独

从您的问题描述来看,您似乎希望将所有数据组合在一起,因此最好只创建一个TDB数据集并查询它
tdbloader
将允许您将多个文件加载到单个TDB数据库中


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

我在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 } }

是的,没错,我不需要将它们分开,但我不知道它们可以放在一个tdb中,从几个.nt文件中。我现在正在尝试
tdbloader-loc=location file1 file2 file3..
这是tdbloader的正确用法吗?(这需要一段时间,所以,我想我在等待时会问)使用单独的文件可能有很多理由。最明显的是,不同的数据集可能会在不同的时间间隔进行更新——有些稳定,有些不稳定。加载到TDB可能非常耗时,因此将易失性数据和不易失性数据分离到单独的数据集中是有意义的。还有很多其他的原因。也许您运行单独的服务器是为了安全,而某些数据集根本不需要托管在外部可访问的站点上。另外,通常最好使用
langMatches(lang(?x),'en')
进行过滤,而不是使用
lang(?x)='en'
,因为它处理复杂的语言标记(例如,'en-us')正确。您是否在Fuseki中使用了上述示例?我喜欢这样,如果您不知道图形名称,您可以通过默认图形查询所有内容,但是如果您知道图形名称,您可以使用特定的名称。我还想知道,如果同时选择默认图和命名图,会发生什么情况……它是否会返回重复的结果,因为默认图包含命名图?我从未让Fuseki启动并运行过。我们所拥有的一切都起作用了——尽管我看到它目前还没有运行。顺便说一句,为了限制随意选择查询试图吸收数据库的全部内容,我们的默认图是一组静态术语,描述我们拥有的图以及其中包含的内容。也就是说,我们的默认图形是服务器元数据。谢谢!我通过创建自己的,在ApacheJena/Fuseki中成功地实现了这一点。我使用将三个命名图合并为一个默认图。
WHERE { GRAPH foo:the-graph { ?S ?p ?o } }