2012-07-13 19 views
3

我想比较两个字符串变量,以发现其中是否包含另一个字符串变量,特别是如果一个是由另一个字符串组成的(所以,我想避免检索“信息”包含“格式”我只感兴趣的结果类似于“information_management”包括“信息”sparql正则表达式比较两个字符串变量(一个是由另一个组成)

我已经试过FILTER CONTAINS()和FILTER正则表达式()具有相同的结果。我是否可以修改查询,以便它包含事实,即在该术语之前或之后需要有一个空格?

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

我修改了我的答案,因为我认为我在原始答案中没有回答你的整个问题 – RobV 2012-07-13 18:38:54

回答

2

因此,如果我了解您直接地,你想找到其中一个术语包含在其他不等于另一个的术语对?

如果是这样,你可以添加一个!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), " ") 
      )) 
} 

这要求包含词语之前/之后的字符串必须以空白结尾/开头。你可能不得不玩这个来获得更紧密地模拟你的约束的东西。

1

另一个解决方案是通过对飞构建正则表达式模式,如:

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

我不能完全肯定SPARQL/XML Schema要求\ B,但我想大多数的实现将有它。

相关问题