1

ナレッジベースで 2 つのトリプルのオブジェクトを比較しようとしています。ACL クライアント (Allegro CL Enterprise エディション 9.0) を介してナレッジベースに接続し、次のコードを記述しました。

(select (?s ?threshold ?NameMatch)
    (q- ?s !mynamespace:hasNameMatch ?NameMatch)
    (q- !mynamespace:hasNameMatch !mynamespace:hasThresholdValue ?threshold)
    (setq return (if (>= (?NameMatch ?threshold "true" "false")))     
   (pprint ret))  

私のナレッジベースには次のトリプルが含まれています

Subject             Predicate             Object
ns:hasAddressMatch  ns:hasThresholdValue  "60"
<../729277>         :hasNameMatch         "70"^^xsd:double

?thresholdwith value"60"?NameMatchwith valueを比較しようとしています"70"^^xsd:doubleが、結果を期待してい"true"ます。これどうやってするの?

4

1 に答える 1

2

RDF データでは、空白ノードまたは IRI でないものはリテラルです。リテラルは、単純なリテラル (追加情報のない文字列)、言語タグ付きの文字列、またはデータ型 (IRI) を持つ字句形式 (文字列部分) の場合があります。

あなたのデータでは、字句形式のリテラルに"70"は検閲されたデータ型がありますが、xsd:double. つまり、値は"70"^^xsd:double、倍精度浮動小数点数 70 です。他のリテラル値"60"は単なるリテラルです。1 つは数値で、もう 1 つは文字列であるため、これら 2 つの値を比較してもあまり意味 がありません。

ただし、次の 2 つのオプションがあります。

  1. "60"単純なリテラルと の字句形式で文字列比較を行うことができます。"70"^^xsd:doubleその場合、大文字と小文字を区別するかどうかに応じて、string<またはを使用します (これらは数字文字の文字列であるため、おそらく問題ではありません)。 string-lessp.
  2. "60"プレーンなリテラルには、 に対して有効な字句形式があると想定し、適切な変換を行ってから、数値としてとxsd:doubleを比較できます。"60"^^xsd:double"70"^^xsd:double<

可能であれば、データをクリーンアップすることをお勧めします(ただし、他の場所からのものである場合、これはオプションではない可能性があります) 。これにより<、(2)のように数値比較を行うことができますが、比較時の変換。

これらの RDF の問題に加えて、Lisp コードにもいくつかの問題があります。 ifは 3 つの引数を取ります (ただし、3 番目はオプションです)。1 つ目はテスト条件で、2 つ目と 3 つ目は最初の評価が true かどうかに応じて評価されるフォームです。あなたのコードでifは、引数を1つだけ取得しています:

(if (>= (?NameMatch ?threshold "true" "false")))
    -------------------------------------------

>=これは1 つの引数で呼び出そうとしています。

(?NameMatch ?threshold "true" "false")

?NameMatchこれは、3 つの引数 ( ?threshold"true"および) で指定された関数への関数呼び出しになります"false"。ここでおそらく必要なのは次のとおりです。

(if (>= ?NameMatch ?threshold) "true" "false")

(もちろん、上記のようにテストを変更する必要があるかもしれません。)

于 2013-12-03T13:01:09.673 に答える