3

2 つの文字列変数を比較して、一方が他方に含まれているかどうか、特に一方が他方で構成されているかどうかを確認しようとしています (そのため、「情報」に「フォーマット」が含まれていることを取得したくありません。結果のみに関心があります。同様に「情報管理」には「情報」が含まれます。

FILTER CONTAINS() と FILTER regex() の両方を試しましたが、結果は同じでした。用語の前後にスペースが必要であるという事実を含むようにクエリを変更するにはどうすればよいですか?

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

2 に答える 2

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

これには、包含用語の前後の文字列が空白で終了/開始する必要があります。制約をより厳密にモデル化するものを取得するには、これを試してみる必要があるかもしれません。

于 2012-07-13T16:20:21.203 に答える
1

別の解決策は、次のようにオンザフライで正規表現パターンを構築することです。

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

SPARQL/XML スキーマが \b を必要とするかどうかは完全にはわかりませんが、ほとんどの実装で \b が必要になると思います。

于 2012-07-16T09:17:55.153 に答える