2012-07-13 57 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,但我想大多數的實現將有它。

相關問題