首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在普通Lisp中比较AllegroGraph Prolog中的RDF文字

在普通Lisp中比较AllegroGraph Prolog中的RDF文字
EN

Stack Overflow用户
提问于 2013-12-03 12:23:57
回答 1查看 193关注 0票数 1

我试图比较知识库中两个三元组的对象。我已通过ACL客户端(快板CL企业版9.0)连接知识库,并编写了以下代码:

代码语言:javascript
运行
复制
(select (?s ?threshold ?NameMatch)
    (q- ?s !mynamespace:hasNameMatch ?NameMatch)
    (q- !mynamespace:hasNameMatch !mynamespace:hasThresholdValue ?threshold)
    (setq return (if (>= (?NameMatch ?threshold "true" "false")))     
   (pprint ret))  

我的知识库包括以下三元组

代码语言:javascript
运行
复制
Subject             Predicate             Object
ns:hasAddressMatch  ns:hasThresholdValue  "60"
<../729277>         :hasNameMatch         "70"^^xsd:double

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

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-12-03 13:01:09

在RDF数据中,不是空白节点或IRIs的东西是文字。文字可以是纯文本(没有附加信息的字符串)、带有语言标记的字符串或具有数据类型( 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有三个参数(第三个参数是可选的)。第一种是测试条件,第二种和第三种是根据第一种计算值是否为真来计算的形式。在您的代码中,if只得到一个参数:

代码语言:javascript
运行
复制
(if (>= (?NameMatch ?threshold "true" "false")))
    -------------------------------------------

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

代码语言:javascript
运行
复制
(?NameMatch ?threshold "true" "false")

这将是对名为?NameMatch的函数的函数调用,其中包含三个参数(?threshold"true""false")。你可能想要的是:

代码语言:javascript
运行
复制
(if (>= ?NameMatch ?threshold) "true" "false")

(当然,您可能仍然需要像上面所描述的那样修改测试。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20351125

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档