SPARQL正则表达式比较两个字符串变量(其中一个由另一个组成)

3

我想比较两个字符串变量,以发现一个是否包含在另一个中,特别是如果一个由另一个组成(因此,我想避免检索到“information”包含“format”。我只对类似于“information_management”包括“information”的结果感兴趣。

我已经尝试使用FILTER CONTAINS()和FILTER regex(),但结果相同。如何修改查询以包括需要在术语之前或之后有空格的事实?

SELECT DISTINCT ?l1 ?l2
WHERE
{
?term1 skos:prefLabel ?l1.
?term2 skos:prefLabel ?l2.
FILTER(contains(?l1,?l2))
}

我修改了我的答案,因为我认为在原始答案中没有回答完整你的问题。 - RobV
2个回答

2

如果我理解正确,您想找到一个术语包含另一个术语的一对,但是它们不相等?

如果是这样,您可以在FILTER子句中添加一个!SAMETERM()调用,如下所示:

SELECT DISTINCT ?l1 ?l2
WHERE
{
  ?term1 skos:prefLabel ?l1.
  ?term2 skos:prefLabel ?l2.
  FILTER(!SAMETERM(?l1, ?l2) && contains(?l1,?l2))
}

编辑

重新阅读问题,我认为我的回答没有涵盖整个问题。如果你有“格式”和“信息”这两个词并且不想让它们匹配,你可以采取以下方法:

SELECT DISTINCT ?l1 ?l2
WHERE
{
  ?term1 skos:prefLabel ?l1.
  ?term2 skos:prefLabel ?l2.
  FILTER(!SAMETERM(?l1, ?l2)
         && contains(?l1,?l2) 
         && ( STRENDS(STRBEFORE(?l1, ?l2)," ") 
              || STRSTARTS(STRAFTER(?l1, ?l2), " ")
            ))
}

这要求包含搜索词的字符串前/后必须以空格结束/开始。您可能需要进行一些尝试,以获得更符合约束条件的内容。


1
另一种解决方案是通过动态构建正则表达式模式,例如:
FILTER(regex(concat("\\b", ?l1, "\\b"), ?l2))

我不完全确定SPARQL/XML Schema是否需要\b,但我认为大多数实现都会有它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接