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

时间:2013-12-03 12:23:58

标签: lisp common-lisp rdf allegrograph

我试图在知识库中比较两个三元组的对象。我已经通过ACL客户端(Allegro CL企业版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"。我怎么能这样做?

1 个答案:

答案 0 :(得分:2)

在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作为数字进行比较与<
  3. 我建议,如果可能的话,你要清理你的数据(但如果它来自其他地方,这可能不是一个选项),这样你就可以与<进行数字比较,如(2) ),但无需在比较时进行转换。

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

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

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

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

    这是对具有三个参数?NameMatch?threshold"true"的名为"false"的函数的函数调用。你可能想要的是:

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

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