【问题标题】:Join semantic endpoints in SPARQL query在 SPARQL 查询中加入语义端点
【发布时间】:2011-01-30 07:45:43
【问题描述】:

我正在尝试提出一个同时使用 bibleontology 和 dbpedia 语义数据库的请求:

PREFIX bibleontology: <http://bibleontology.com/resource/>
PREFIX dbo: <http://dbpedia.org/ontology/>

SELECT ?art ?abstract WHERE { 
bibleontology:Ezra owl:sameAs ?art .
?art dbo:abstract ?abstract .
}

这种请求既不适用于 bibleontology SPARQL 端点,也不适用于 dbpedia SPARQL 端点。请求的各个部分在每个 SPARQL 端点上都可以正常工作。

这种方式可以加入数据库吗?

【问题讨论】:

  • 模型未合并时,如何进行交叉查询。也许您可以通过合并两个 rdf 存储(模型)自己执行数据整理,但是您不能执行交叉查询。
  • 所以 RDF 提供了到描述模型的地方的链接,但从不提供到数据本身的链接?我认为语义网络的目标之一是允许对各种数据集进行分布式查询?
  • 也许我不理解评论,因为正在合并的模型中。 the sameAs entry for bibleontology: Ezra 确实提供了一个 dbo 条目的链接。这就是让我认为可以加入他们的原因。
  • 正如我在回答中解释的那样,您可以使用语义 Web 客户端库来做到这一点,本质上,该库会为您缓存部分数据库,以回答您的 SPARQL 查询。我希望这就是你要找的。​​span>
  • 看看我的回答 - 如果您的端点支持 SPARQL 1.1 SERVICE 关键字,或者您有一个支持的本地端点/工具,那么您可以使用它来实现您的目标

标签: database semantic-web sparql


【解决方案1】:

我是 bibleontology.com 的工程师

bibleontology.com 采用 SPARQL1.1

PREFIX bibleontology: <http://bibleontology.com/resource/>
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
SELECT ?art ?abstract
WHERE {
SERVICE <http://bibleontology.com/sparql/> { bibleontology:Ezra owl:sameAs ?art . }
SERVICE <http://dbpedia.org/sparql> { ?art dbo:abstract ?abstract . } }

【讨论】:

    【解决方案2】:

    该查询在 dbpedia 或 bibleontology 上都不起作用,因为信息存储在两个不同的数据库中,当您运行 SPARQL 查询时,您基本上会选择其中一个。这意味着您必须从两个数据库下载数据并将它们放入本地三重存储,以便能够像您展示的那样运行 SPARQL 查询。另一种选择是使用为您执行此操作的库。

    The Semantic Web Client Library 将遵循您在 SPARQL 查询中拥有的所有 URI,并从每个资源下载 RDF 数据,以便它可以加入您查询中出现的所有三元组模式并给出答案。

    您可以通过一些小的更改来运行您的查询:

    PREFIX bibleontology: <http://bibleontology.com/resource/>
    PREFIX dbo: <http://dbpedia.org/ontology/>
    PREFIX owl: <http://www.w3.org/2002/07/owl#>
    PREFIX dbpedia: <http://dbpedia.org/ontology/> 
    
    SELECT * WHERE { 
    bibleontology:Ezra owl:sameAs ?art .
    ?art dbpedia:abstract ?abstract .
    FILTER langMatches( lang(?abstract), "EN" )
    } 
    

    改动说明:

    1. 包括owldbpedia 命名空间
    2. ?art dbpedia:abstract ?abstract . 你需要匹配 dbpedia:abstract 谓词来获取摘要而不是 bibleontology:abstract 以便从 dbpedia 获取摘要
    3. 我还添加了filter 以仅检索英文摘要,这当然是可选的。

    下载“The Semantic Web Library”并将查询放入文件(即:query.sparql)后,您可以运行以下命令来测试您的查询:

    ./semwebquery -sparqlfile query.sparql -retrieveduris -maxsteps 5
    

    语义 Web 客户端库文档中解释了所有命令参数。

    你会得到以下输出:

    | ?art                               | ?abstract
    | <http://dbpedia.org/resource/Ezra> | "Ezra is a major .... "@en |
    
    Successfully dereferenced URIs: 
    
    http://www.w3.org/2002/07/owl
    http://bibleontology.com/data/Ezra
    http://dbpedia.org/data/Ezra.xml
    http://dbpedia.org/data3/abstract.n3
    

    为简单起见,我省略了来自 dbpedia 的长摘要。 “成功取消引用的 URI”列表是库检索的文档以回答您的查询。在该库的文档中,您将了解如何在 Java 中以编程方式运行查询。

    【讨论】:

    • 这很有趣,虽然这个工具很慢。由于某种原因,这个工具似乎只返回一个结果,即使请求应该返回多个结果,例如PREFIX bo: &lt;http://bibleontology.com/resource/&gt; PREFIX bop: &lt;http://bibleontology.com/property/&gt; PREFIX dbo: &lt;http://dbpedia.org/ontology/&gt; PREFIX owl: &lt;http://www.w3.org/2002/07/owl#&gt; PREFIX dbpedia: &lt;http://dbpedia.org/ontology/&gt; SELECT DISTINCT ?Parent ?Abstract WHERE { bo:Moses bop:hasParents ?Parent . ?Parent owl:sameAs ?art . ?art dbpedia:abstract ?Abstract . FILTER ( LANG(?Abstract) = "en" ) }
    • 实际上,如果我只搜索父母,它会给我一个包含两个条目的列表,但是如果我搜索摘要,它只会列出第一个父母的摘要,而不是第二个父母的摘要.
    【解决方案3】:

    所有其他答案都是正确的,因为您无法按原样进行查询,因为数据未组合在单个 SPARQL 端点中。如果其中一个端点支持 SPARQL 1.1 联合查询,那么您可以像这样使用 SERVICE 关键字:

    PREFIX bibleontology: <http://bibleontology.com/resource/>
    PREFIX dbo: <http://dbpedia.org/ontology/>
    PREFIX owl: <http://www.w3.org/2002/07/owl#>
    
    SELECT ?art ?abstract
    WHERE 
    { 
      bibleontology:Ezra owl:sameAs ?art .
      SERVICE <http://dbpedia.org/sparql?default-graph-uri=http://dbpedia.org> { ?art dbo:abstract ?abstract . }
    }
    

    您将上述查询提交到 bibleontology SPARQL 端点,并假设它支持 SERVICE 关键字,它会将您的部分查询发送到 DBPedia SPARQL 端点。

    即使您的 SPARQL 端点支持 SERVICE 关键字,那么您仍然依赖于两个数据集中的相关数据,即圣经本体需要有一个指向 DBPedia 资源的 owl:sameAs,以便 @ 987654328@子句其实什么都找。

    或者

    如果您的两个端点都不支持 SERVICE 关键字,那么您可以设置本地端点或使用支持 SERVICE 关键字的命令行工具(如果您有兴趣,我会挖掘一些链接)和然后发出以下命令:

    PREFIX bibleontology: <http://bibleontology.com/resource/>
    PREFIX dbo: <http://dbpedia.org/ontology/>
    PREFIX owl: <http://www.w3.org/2002/07/owl#>
    
    SELECT ?art ?abstract
    WHERE 
    { 
      SERVICE <http://bibleontology.com/sparql> { bibleontology:Ezra owl:sameAs ?art . }
      SERVICE <http://dbpedia.org/sparql?default-graph-uri=http://dbpedia.org> { ?art dbo:abstract ?abstract . }
    }
    

    如果您的本地工具/端点支持SERVICE,那么它将能够将查询的相关部分发送到相关端点并在本地进行连接,并希望返回您所追求的结果

    【讨论】:

    • 这看起来很有趣,但它不适用于我尝试的两个 SPARQL 端点中的任何一个。我将继续尝试其他端点。如何安装本地端点?
    • 是的,很遗憾,上面是 SPARQL 1.1,所以还没有被广泛采用
    • 我刚刚进入 SPARQL 等等。你能给我一些支持 SPARQL 1.1 的本地端点吗?
    • 看看FusekiStore Manager(使用内存中的连接) - 免责声明 - 我是这两个工具的开发人员
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-04
    • 1970-01-01
    相关资源
    最近更新 更多