我试图比较两个字符串变量,以发现一个是否包含在另一个中,特别是如果一个由另一个组成(所以,我想避免检索“信息”包含“格式”。我感兴趣仅在类似于“information_management”的结果中包含“信息”。
我尝试了FILTER CONTAINS()和FILTER regex(),效果相同。如何修改查询,使其包含在术语之前或之后需要有空格的事实?
SELECT DISTINCT ?l1 ?l2
WHERE
{
?term1 skos:prefLabel ?l1.
?term2 skos:prefLabel ?l2.
FILTER(contains(?l1,?l2))
}
答案 0 :(得分: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 :(得分:1)
另一种解决方案是动态构建正则表达式模式,如:
FILTER(regex(concat("\\b", ?l1, "\\b"), ?l2))
我不完全确定SPARQL / XML Schema需要\ b,但我认为大多数实现都会有它。