lisp - 比较 Common Lisp 中 AllegroGraph Prolog 中的 RDF 文字

标签 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"。我该怎么做?

最佳答案

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

在您的数据中,具有词汇形式的文字 "70"有一个你审查过的数据类型,但我认为应该是 xsd:double .即,值为 "70"^^xsd:double ,这是 double float 70。您的其他文字值 "60"只是一个普通的文字。比较这两个值真的没有意义,因为一个是数字,一个是字符串。

不过你有两个选择:

  1. 您可以将字符串与普通文字 "60" 进行比较和 "70"^^xsd:double 的词法形式, 在这种情况下你会使用 string< string-lessp ,取决于您是否需要区分大小写(因为这些是数字字符串,所以可能无关紧要)。
  2. 您可以假设普通文字 "60"有一个合法的词法形式 xsd:double ,做适当的转换,然后比较"60"^^xsd:double"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")

(当然,你可能仍然需要按照上面的描述修改测试。)

关于lisp - 比较 Common Lisp 中 AllegroGraph Prolog 中的 RDF 文字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20351125/

相关文章:

rdf - 如何获取sparql查询结果的所有解引用链接

lisp - Common Lisp 对 car 和 cdr 的引用行为

clojure - 将一段 Lisp 代码移植到 Clojure (PAIP)

recursion - lisp中的递归函数出错

scheme - 使用方案中的字符串获取变量值

sparql - 在海龟或 RDF 中,我可以在符合条件的所有主题上添加谓词/宾语吗?

python - 你可以用 Lisp 宏做什么,而一流的函数却做不到?

common-lisp - 如何使用 drakma :http-request and flexistreams 下载和保存文件

loops - LISP 如何在不使用 LOOP 的情况下编写此函数

rdf - 文字是 RDF 资源吗?