1

我正在尝试比较知识库中两个三元组的对象。我已经通过ACL客户端(Allegro CL Enterprise edition 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. 您可以与普通文字"60"和 的词法形式进行字符串比较"70"^^xsd:double,在这种情况下,您将使用string<or string-lessp,具体取决于您是否需要区分大小写(因为这些是数字字符串,可能没关系) .
  2. 您可以假设普通文字"60"具有对 a 合法的词汇形式,xsd:double进行适当的转换,然后将"60"^^xsd:doubleand"70"^^xsd:double作为数字与<.

我建议,如果可能的话,你清理你的数据(但如果它来自其他地方,这可能不是一个选项),这样你就可以<像(2)那样进行数字比较,但不需要做比较时的转换。

除了那些 RDF 问题之外,您的 Lisp 代码也有一些问题。 if接受三个参数(但第三个是可选的)。第一个是测试条件,第二个和第三个是根据第一个评估是否为真而评估的形式。在您的代码中,if只有一个参数:

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

这是试图>=用一个参数调用,这就是

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

?NameMatch这将是对使用三个参数 (?threshold"true")命名的函数的函数调用"false"。您可能想要的是:

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

(当然,您可能仍需要如上所述修改测试。)

于 2013-12-03T13:01:09.673 回答