【问题标题】:Sparql howto select one result to ask another service in federated searchSparql 如何选择一个结果以在联合搜索中询问另一项服务
【发布时间】:2014-07-23 12:48:38
【问题描述】:

如何选择 rdf 可能的标签之一将其发送到联合搜索?

我有一个 rdf 记录,它有几个到另一个数据库的链接:

<owl:sameAs rdf:resource="http://cantic.bnc.cat/registres/CUCId/a10035400"/>
<owl:sameAs rdf:resource="http://viaf.org/viaf/61502721"/>
<owl:sameAs rdf:resource="http://dbpedia.org/resource/Delfi_Abella"/>
<owl:sameAs rdf:resource="http://id.loc.gov/authorities/names/nr2005020137"/>
<owl:sameAs rdf:resource="http://d-nb.info/gnd/158288475"/>

我刚刚获得了 dbpedia 链接,以便使用它在 dbpedia 中询问一些信息。

我创建了这个联合搜索,但它不起作用:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl/>
PREFIX rdaGr2: <http://rdvocab.info/ElementsGr2/>
PREFIX dbo:<http://dbpedia.org/ontology/>

SELECT *
WHERE {
  ?autid rdaGr2:dateOfBirth "1991" .
  ?autid owl:sameAs ?dbpediaid 
  FILTER regex(?dbpediaid,'dbpedia','i') .
  SERVICE <http://dbpedia.org/sparql>
  {
    ?dbpediaid dbo:birthPlace ?naixement
  }
}

我做错了什么?

如果我使用单一搜索:

PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl/>
PREFIX rdaGr2: <http://rdvocab.info/ElementsGr2/>
PREFIX dbo:<http://dbpedia.org/ontology/>

SELECT *
WHERE {
  ?autid rdaGr2:dateOfBirth "1991" .
  ?autid owl:sameAs ?dbpediaid 
  FILTER regex(?dbpediaid,'dbpedia','i') .
}

我得到了 autid 和 dbpedia 链接。

autid                                                           dbpediaid
http://arties.cbuc.cat/openccuc/a10985256/  http://dbpedia.org/resource/Emma_Roberts

我如何告诉 SERVIE 只需使用它。

问候


更新(最初作为答案发布)

也许我问得不好:

我尝试将两种不同的 sparql 合二为一。使用问题第一部分的结果(已应用过滤器),我尝试询问 DBPEDIA 以获得我需要的结果。

从没有任何过滤器的第一部分开始

PREFIX foaf:  <http://xmlns.com/foaf/0.1/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX void: <http://rdfs.org/ns/void#>
PREFIX owl: <http://www.w3.org/2002/07/owl/>
PREFIX rdaGr2: <http://rdvocab.info/ElementsGr2/>
PREFIX dbpedia-owl: <http://dbpedia.org/ontology/>
PREFIX dbo:<http://dbpedia.org/ontology/>

SELECT *
WHERE {
  ?autid rdaGr2:dateOfBirth "1991" .
  ?autid owl:sameAs ?dbpediaid 
 }

我得到了这个结果:

http://arties.cbuc.cat/openccuc/a10603050/  http://cantic.bnc.cat/registres/CUCId/a10603050
http://arties.cbuc.cat/openccuc/a10603050/  http://viaf.org/viaf/169463957
http://arties.cbuc.cat/openccuc/a10667283/  http://cantic.bnc.cat/registres/CUCId/a10667283
http://arties.cbuc.cat/openccuc/a10667283/  http://viaf.org/viaf/303916880
http://arties.cbuc.cat/openccuc/a10895814/  http://cantic.bnc.cat/registres/CUCId/a10895814
http://arties.cbuc.cat/openccuc/a10895814/  http://viaf.org/viaf/107201286
http://arties.cbuc.cat/openccuc/a10895814/  http://d-nb.info/gnd/140511695
http://arties.cbuc.cat/openccuc/a10895814/  http://id.loc.gov/authorities/names/no2010103795
http://arties.cbuc.cat/openccuc/a10985256/  http://cantic.bnc.cat/registres/CUCId/a10985256
http://arties.cbuc.cat/openccuc/a10985256/  http://viaf.org/viaf/85925873
http://arties.cbuc.cat/openccuc/a10985256/  http://id.loc.gov/authorities/names/no2005021393
http://arties.cbuc.cat/openccuc/a10985256/  http://d-nb.info/gnd/141167203
http://arties.cbuc.cat/openccuc/a10985256/  http://dbpedia.org/resource/Emma_Roberts
http://arties.cbuc.cat/openccuc/a11019682/  http://cantic.bnc.cat/registres/CUCId/a11019682
http://arties.cbuc.cat/openccuc/a11019682/  http://viaf.org/viaf/157747131
http://arties.cbuc.cat/openccuc/a11045553/  http://cantic.bnc.cat/registres/CUCId/a11045553
http://arties.cbuc.cat/openccuc/a11045553/  http://viaf.org/viaf/126161085

我应用过滤器

PREFIX foaf:  <http://xmlns.com/foaf/0.1/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX void: <http://rdfs.org/ns/void#>
PREFIX owl: <http://www.w3.org/2002/07/owl/>
PREFIX rdaGr2: <http://rdvocab.info/ElementsGr2/>
PREFIX dbpedia-owl: <http://dbpedia.org/ontology/>
PREFIX dbo:<http://dbpedia.org/ontology/>

SELECT *
WHERE {
  ?autid rdaGr2:dateOfBirth "1991" .
  ?autid owl:sameAs ?dbpediaid 
  FILTER regex(?dbpediaid,'dbpedia','i') .
}

只得到一个结果:

http://arties.cbuc.cat/openccuc/a10985256/  http://dbpedia.org/resource/Emma_Roberts

我想将它发送到 DBPEDIA 的服务,但只需发送此 URL: http://dbpedia.org/resource/Emma_Roberts

不是我从第一部分得到的所有 URL:

http://cantic.bnc.cat/registres/CUCId/a10603050
http://viaf.org/viaf/169463957
http://cantic.bnc.cat/registres/CUCId/a10667283
http://viaf.org/viaf/303916880
http://cantic.bnc.cat/registres/CUCId/a10895814
http://viaf.org/viaf/107201286
http://d-nb.info/gnd/140511695
http://id.loc.gov/authorities/names/no2010103795
http://cantic.bnc.cat/registres/CUCId/a10985256
http://viaf.org/viaf/85925873
http://id.loc.gov/authorities/names/no2005021393
http://d-nb.info/gnd/141167203
http://dbpedia.org/resource/Emma_Roberts

因为其中一些与 DBPEDIA 无关,然后 DBPEDIA 向我发送如下错误:

Virtuoso RDFZZ Error DB.DBA.SPARQL_REXEC('http://dbpedia.org/sparql', ...) returned Content-Type 'text/plain' status 'HTTP/1.1 400 Bad Request
'
Virtuoso 37000 Error SP030: SPARQL compiler, line 3: syntax error at '_' before ':'

SPARQL query:
define sql:big-data-const 0  SELECT ?naixement
 WHERE  {  <http://dbpedia.org/resource/Emma_Roberts> <http://dbpedia.org/ontology/birthPlace> ?naixement .
     FILTER (_::default-20-7 =  <http://arties.cbuc.es:8990/CCUCAF>) }

SPARQL query:
define sql:big-data-const 0 
#output-format:text/html
define sql:signal-void-variables 1 define get:soft "soft" define input:default-graph-uri <http://arties.cbuc.es:8990/CCUCAF> PREFIX foaf:  <http://xmlns.com/foaf/0.1/>
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX void: <http://rdfs.org/ns/void#>
PREFIX owl: <http://www.w3.org/2002/07/owl/>
PREFIX rdaGr2: <http://rdvocab.info/ElementsGr2/>
PREFIX dbpedia-owl: <http://dbpedia.org/ontology/>
PREFIX dbo:<http://dbpedia.org/ontology/>

SELECT ?naixement
WHERE {
  ?autid rdaGr2:dateOfBirth "1991" .
  ?autid owl:sameAs ?dbpediaid 
  filter regex( str(?dbpediaid),'dbpedia','i')

  SERVICE <http://dbpedia.org/sparql>
  {
    ?dbpediaid dbo:birthPlace ?naixement
  }

【问题讨论】:

    标签: sparql semantic-web dbpedia virtuoso federated-queries


    【解决方案1】:

    FILTER regex(?dbpediaid,'dbpedia','i') 可能会失败,因为 ?dbpediaid 不是字符串;但是一个URI。相反,您应该使用 FILTER regex(str(?dbpediaid),'dbpedia','i')。但是,您的第二个查询返回一些结果的事实使得 URI 似乎被隐式转换为字符串。不过,这可能是您正在使用的特定实现的扩展。

    但是,当我使用 Apache Jena 执行以下查询时,我得到空结果:

    prefix dbpedia: <http://dbpedia.org/resource/>
    prefix dbpedia-owl: <http://dbpedia.org/ontology/>
    
    select * where {
      bind( dbpedia:Emma_Roberts as ?dbpediaid )
      filter regex( ?dbpediaid,'dbpedia','i')
    
      service <http://dbpedia.org/sparql> {
        ?dbpediaid dbpedia-owl:birthPlace ?naixement
      }
    }
    
    -------------------------
    | dbpediaid | naixement |
    =========================
    -------------------------
    

    如果我更改为使用 str(?dbpediaid),我会得到结果:

    prefix dbpedia: <http://dbpedia.org/resource/>
    prefix dbpedia-owl: <http://dbpedia.org/ontology/>
    
    select * where {
      bind( dbpedia:Emma_Roberts as ?dbpediaid )
      filter regex( str(?dbpediaid),'dbpedia','i')
    
      service <http://dbpedia.org/sparql> {
        ?dbpediaid dbpedia-owl:birthPlace ?naixement
      }
    }
    
    --------------------------------------------------------------------------------------
    | dbpediaid            | naixement                                                   |
    ======================================================================================
    | dbpedia:Emma_Roberts | <http://dbpedia.org/resource/Rhinebeck_(village),_New_York> |
    --------------------------------------------------------------------------------------
    

    请注意,如果查询引擎首先执行 service 部分,这可能是一个非常昂贵的查询,因为它会首先检索 all dbpedia-owl:birthPlace 三元组,将它们带回来,然后然后与您关心的特定匹配。如果不是像我上面那样使用 bind,可能会有不同的行为,而 ?dbpediaid 的值只是来自一些三重匹配。

    【讨论】:

    • 对不起,我解释得不好
    • @jordiPallares 您发布了一个实际上不是答案的“答案”,应该是对问题的编辑。我想我理解你想要做什么:你试图从一个地方(不是 DBpedia)查询数据,然后使用这些值中的 some 作为对 DBpedia 执行的查询中的参数service &lt;http://dbpedia.org/sparql&gt; { … }。那是对的吗?然后您说因为其中一些与 DBPEDIA 无关,然后 DBPEDIA 向我发送这样的错误:...。错误消息并没有说问题在于 URI“与 DBpedia 无关”,但是……
    • …而不是 DBpedia 返回文本而不是 SPARQL 结果。它返回的实际文本是来自 DBpedia 的错误消息:Virtuoso 37000 Error SP030: SPARQL compiler, line 3: syntax error at '_' before ':' 我想是指查询:FILTER (_::default-20-7 = &lt;http://arties.cbuc.es:8990/CCUCAF&gt;)。我预计它会抱怨_::default-20-7,但我不确定。如果您收到如此详细的错误消息,那么您应该已将其发布在原始问题中。
    • 确实收到了比您在原始问题中提出的更详细的错误。您将其发布在答案中;那是我复制它的地方!
    猜你喜欢
    • 2015-12-22
    • 1970-01-01
    • 1970-01-01
    • 2019-09-06
    • 1970-01-01
    • 1970-01-01
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多