gpt4 book ai didi

regex - SPARQL:组合和排除正则表达式过滤器

转载 作者:行者123 更新时间:2023-12-01 16:09:23 24 4
gpt4 key购买 nike

我想过滤特定关键字的 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 属性,因此它可能只查找其中一个属性而忽略其他属性。

有任何想法吗?将不胜感激!

最佳答案

问题是您的组合过滤器检查 ?subject 的相同绑定(bind)。 .因此,如果至少有一个 ?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 端点中启用)。

关于regex - SPARQL:组合和排除正则表达式过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20777406/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com