在Common Lisp中比较AllegroGraph Prolog中的RDF文本



我正在尝试比较知识库中两个三元组的对象。我已经通过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

我试图将?threshold与值"60"进行比较,将?NameMatch与值"70"^^xsd:double进行比较,并期待结果"true"。我该怎么做?

在RDF数据中,不是空白节点或IRI的东西都是文字。文字可以是纯文字(没有附加信息的字符串)、带有语言标记的字符串,也可以是具有数据类型(IRI)的词法形式(字符串部分)。

在您的数据中,词法形式为"70"的文字具有您已经审查过的数据类型,但我认为应该是xsd:double。即,值为"70"^^xsd:double,它是双精度浮点数字70。您的另一个文字值"60"只是一个普通文字。比较这两个值是没有意义的,因为一个是数字,一个是字符串。

不过你有两个选择:

  1. 您可以使用纯文字"60"和词汇形式"70"^^xsd:double进行字符串比较,在这种情况下,您可以使用string<string-lessp,这取决于您是否需要区分大小写(因为这些都是数字字符串,所以可能无关紧要)
  2. 您可以假设纯文字"60"的词法形式对于xsd:double是合法的,进行适当的转换,然后将"60"^^xsd:double"70"^^xsd:double作为数字与<进行比较

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

除了这些RDF问题之外,您的Lisp代码还存在一些问题。if有三个参数(不过第三个是可选的)。第一个是测试条件,第二个和第三个是根据第一个值是否为true进行评估的形式。在您的代码中,if只得到一个参数:

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

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

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

其将是对具有三个自变量(?threshold"true""false")的名为?NameMatch的函数的函数调用。你可能想要的是:

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

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

相关内容

  • 没有找到相关文章

最新更新