【问题标题】:Comparing two strings with SPARQL使用 SPARQL 比较两个字符串
【发布时间】:2013-11-15 09:23:11
【问题描述】:

我正在使用带有 SPARQL 的正则表达式函数。 是否有一个函数可以找到一个与另一个字符串有最小距离的字符串? 我的意思是,我需要一个函数,它给我的词与另一个词最相似。 实际上我传递了两个变量(这些变量取值来自两个不同的数据集)并仅考虑这些不区分大小写的情况进行比较。所以我需要一个可以比较两个变量的函数。有谁知道吗?

【问题讨论】:

  • 你能澄清一下你的用例吗?我不太清楚你想做什么。 “找到与另一个字符串具有最小距离的字符串的函数”听起来像一个函数,它接受一个 single 参数并从固定集合中返回一些单词。但是“我传递了两个变量(......来自两个不同的数据集)并进行比较,只是考虑到这些不区分大小写。......我需要一个可以比较两个变量的函数。”听起来你想要sim(?w1,?w2) 之类的东西返回一个数字,这样你就可以这样做,例如order by sim(?w1,?w2)
  • 请将 cmets 作为 cmets 发布,而不是作为答案发布。您写道:“我并没有说我在 OWLIM 存储库中使用 SPARQL。我想要一个接收 2 个变量的函数,它会说明它们是否足够接近。当我说接近时,我的意思是一个词需要最少数量的更改为第二个,因此 2 个单词必须尽可能相似。就像您使用正则表达式时一样(例如 regex(?x, ?y, "i")),但比较不同。”
  • 您的意思是“最少的更改”是什么意思?像sim("root","book") 这样的东西只需要更改两个字母。但是你不能说“两个”是最不重要的,除非你有别的东西可以比较。我是否正确理解您希望能够执行select ?x ?y where { ... } order by sim(?x,?y) limit 1 之类的操作,以便获得编辑距离在所有?x?ys 中最小的?x?y

标签: rdf sparql


【解决方案1】:

标准 SPARQL 中没有这样的功能。但是,SPARQL 是可扩展的,因此您可以根据需要添加自己的函数(当然,代价是失去查询的可移植性)。例如,请参阅此tutorial on how to do this in Sesame's SPARQL engine

我还认为,一些扩展了全文搜索支持的三元存储库(如 OWLIM 或 Virtuoso)可能对这类东西有一些内置支持,但我不确定这一点。

编辑

假设你想要类似 Levenshtein 距离的东西,你可以有一个函数 ex:ldistance(?string1, ?string2) 给定两个字符串输出距离。所以ex:ldistance("room", "root") 将返回 1,ex:ldistance("room", "door") 将返回 2,依此类推。然后,您可以使用它来查询给定的距离,例如让所有比 2 更接近“房间”的字符串:

SELECT ?x ?string1 
WHERE {
       ?x rdfsl:abel ?string1 
       FILTER(ex:ldistance("room", ?string1) < 2)
}

或返回所有按距离排序的匹配字符串:

SELECT ?x ?string1 ?ldistance
WHERE {
       ?x rdfsl:abel ?string1 
       BIND ( ex:ldistance("room", ?string1) as ?ldistance)
}
ORDER BY ?ldistance

但是,如前所述,函数 ex:ldistance 实际上并不存在于 SPARQL 中,因此您需要自己创建它作为扩展。

【讨论】:

  • 我没有说我在 OWLIM 存储库中使用 SPARQL。我想要一个接收 2 个变量的函数,如果它们足够接近的话。当我说接近时,我的意思是一个词需要最少的变化才能成为第二个词,所以两个词必须尽可能相似。就像您使用正则表达式时一样(例如 regex(?x, ?y, "i")),但比较不同。
  • 是的。我明白。大概你想要像 Levenshtein 或 Jaro-Winkler 这样的东西。重复一遍:标准 SPARQL 中没有这样的功能,但一些三元存储可能有一些扩展 - 或者您可以创建自己的扩展。
  • 我已经更新了我的答案,并举例说明了如何在 SPARQL 中使用此类函数。
  • 有关 Virtuoso 全文索引支持的详细信息,请访问 docs.openlinksw.com/virtuoso/sparqlextensions.html
猜你喜欢
  • 2012-08-07
  • 1970-01-01
  • 2020-09-05
  • 2017-07-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多