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

Regex sparql正则表达式比较两个字符串变量(一个由另一个组成),regex,contains,sparql,Regex,Contains,Sparql,我试图比较两个字符串变量,以发现其中一个是否包含在另一个中,特别是其中一个是否由另一个组成(因此,我希望避免检索“信息”包含“格式”。我只对类似于“信息管理”包含“信息”的结果感兴趣 我尝试了FILTER CONTAINS()和FILTER regex(),结果相同。如何修改查询,使其包含在术语之前或之后需要有空格的事实 SELECT DISTINCT ?l1 ?l2 WHERE { ?term1 skos:prefLabel ?l1. ?term2 skos:prefLabel ?l2. FI

我试图比较两个字符串变量,以发现其中一个是否包含在另一个中,特别是其中一个是否由另一个组成(因此,我希望避免检索“信息”包含“格式”。我只对类似于“信息管理”包含“信息”的结果感兴趣

我尝试了FILTER CONTAINS()和FILTER regex(),结果相同。如何修改查询,使其包含在术语之前或之后需要有空格的事实

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

如果我理解正确,你想找到一对术语,其中一个术语包含在另一个术语中,但不等于另一个

如果是这样,您可以将
!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), " ")
            ))
}

这要求包含术语前/后的字符串必须以空格结尾/开头。您可能需要使用空格来获得更接近约束模型的内容。

另一种解决方案是动态构建正则表达式模式,如:

FILTER(regex(concat("\\b", ?l1, "\\b"), ?l2))

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

我修改了我的答案,因为我认为我在最初的答案中没有回答您的全部问题