【问题标题】:SPARQL: combine and exclude regex filtersSPARQL:组合和排除正则表达式过滤器
【发布时间】:2013-12-25 22:50:36
【问题描述】:

我想过滤特定关键字的 SPARQL 查询,同时排除其他关键字。我认为这可以通过FILTER (regex(str(?var),"includedKeyword","i") && !regex(str(?var),"excludedKeyword","i")) 轻松完成。它可以在没有“!”的情况下工作条件,但不与。我也把 FILTER 语句分开了,但是没用。

我在http://europeana.ontotext.com/ 上使用了这个查询:

PREFIX dc: <http://purl.org/dc/elements/1.1/>
PREFIX edm: <http://www.europeana.eu/schemas/edm/>
PREFIX ore: <http://www.openarchives.org/ore/terms/>

        SELECT DISTINCT ?CHO
        WHERE {
          ?proxy dc:subject ?subject .
          FILTER ( regex(str(?subject),"gemälde","i") && !regex(str(?subject),"Fotografie","i") )
          ?proxy edm:type "IMAGE" .
          ?proxy ore:proxyFor ?CHO.
          ?agg edm:aggregatedCHO ?CHO; edm:country "germany".
        }

但我总是在第一行得到标题为“Gemäldegalerie”的结果,它的 dc:subject 为“Fotografie”(我想排除的那个)。我认为问题在于来自 Europeana 数据库的一个对象可以具有多个 dc:subject 属性,因此它可能只查找其中一个属性而忽略其他属性。

有什么想法吗?将不胜感激!

【问题讨论】:

    标签: regex filter sparql rdf europeana-api


    【解决方案1】:

    问题在于您的组合过滤器检查?subject 的相同绑定。因此,如果?subject 的至少一个值与这两个条件匹配(这几乎总是正确的,因为字符串“Gemäldegalerie”,例如,匹配您的第一个正则表达式而与第二个不匹配),则它会成功。

    因此,对于否定条件,您需要制定一些东西来检查所有可能的值,而不仅仅是一个特定的值。您可以使用 SPARQL 的 NOT EXISTS 函数来执行此操作,例如:

      PREFIX dc: <http://purl.org/dc/elements/1.1/>
      PREFIX edm: <http://www.europeana.eu/schemas/edm/>
      PREFIX ore: <http://www.openarchives.org/ore/terms/>
    
      SELECT DISTINCT ?CHO
      WHERE {
          ?proxy edm:type "IMAGE" .
          ?proxy ore:proxyFor ?CHO.
          ?agg edm:aggregatedCHO ?CHO; edm:country "germany".
          ?proxy dc:subject ?subject . 
          FILTER(regex(str(?subject),"gemälde","i")) 
          FILTER NOT EXISTS { 
                ?proxy dc:subject ?otherSubject. 
                FILTER(regex(str(?otherSubject),"Fotografie","i")) 
          }
        }
    

    顺便说一句:由于您正在执行正则表达式检查,并且现在将它们与NOT EXISTS 运算符结合起来,因此对于查询处理器而言,这可能很快就会变得非常昂贵。您可能需要考虑制定查询的替代方法(例如,使用确切的主题字符串来包含或排除以消除正则表达式),或者甚至查看 SPARQL 端点可能提供的一些非标准扩展(OWLIM ,例如,运行 Europeana 端点的商店支持各种full-text-search extensions,尽管我不确定它们是否在 Europeana 端点中启用)。

    【讨论】:

    • 谢谢,这对我来说似乎很清楚,我只需要更熟悉这些东西。我还考虑过使用不带正则表达式的确切字符串,但问题是 Europeana 聚合了来自许多不同提供商的元数据,这些提供商都使用自己的 dc:subject 名称,因此例如我不仅需要查询“照片”,还需要查询“摄影” ”或“摄影”。这就是正则表达式派上用场的地方。或者也许有一种方法可以在 SPARQL 中查找更多非特定文字?
    • 通过您对全文搜索扩展的建议,我发现 Lucene 查询做得很好。我可以使用类似 ?subject on:luceneQuery "foto*" 的东西(首先将 PREFIX 定义到:ontotext.com/>),这正是我想要的。再次感谢您的出色回答,我自己从来没有想过这个!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多