gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 18:53:48 25 4
gpt4 key购买 nike

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com