【问题标题】:sparql regex compare two string variables (one is composed by the other)sparql 正则表达式比较两个字符串变量(一个由另一个组成)
【发布时间】:2012-07-13 09:05:23
【问题描述】:

我正在尝试比较两个字符串变量以发现一个是否包含在另一个中,特别是一个是否由另一个组成(因此,我想避免检索“信息”包含“格式”。我很感兴趣仅在类似于“information_management”的结果中包含“信息”。

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

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

【问题讨论】:

  • 我修改了我的答案,因为我认为我在原来的答案中没有回答你的整个问题

标签: regex contains sparql


【解决方案1】:

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

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

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), " ")
            ))
}

这要求包含术语之前/之后的字符串必须以空格结尾/开头。您可能必须尝试一下才能获得更接近您的约束的模型。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-11-21
      • 2019-07-10
      • 1970-01-01
      • 1970-01-01
      • 2019-06-22
      • 1970-01-01
      • 1970-01-01
      • 2014-05-23
      相关资源
      最近更新 更多