在Common Lisp中比较AllegroGraph Prolog中的RDF文本
我试图在知识库中比较两个三元组的对象。我通过ACL客户端(Allegro CL Enterprise edition 9.0)连接了知识库,并编写了以下代码:在Common Lisp中比较AllegroGraph Prolog中的RDF文本,lisp,common-lisp,rdf,allegrograph,Lisp,Common Lisp,Rdf,Allegrograph,我试图在知识库中比较两个三元组的对象。我通过ACL客户端(Allegro CL Enterprise edition 9.0)连接了知识库,并编写了以下代码: (select (?s ?threshold ?NameMatch) (q- ?s !mynamespace:hasNameMatch ?NameMatch) (q- !mynamespace:hasNameMatch !mynamespace:hasThresholdValue ?threshold) (setq
(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
主谓宾语
ns:hasAddressMatch ns:hasThresholdValue“60”
:hasname匹配“70”^^xsd:double
我正在尝试比较
?阈值与值“60”
和?名称匹配与值“70”^^xsd:double
,我希望结果“true”
。如何做到这一点?在RDF数据中,不是空白节点或IRI的内容是文本。文字可以是普通文字(不包含任何附加信息的字符串)、带有语言标记的字符串或带有数据类型(IRI)的词汇形式(字符串部分)
在您的数据中,词法形式为“70”
的文本有一个您已经审查过的数据类型,但我假设它应该是xsd:double
。即,该值为“70”^^xsd:double
,即双精度浮点数70。您的另一个文本值“60”
只是一个普通文本。比较这两个值是没有意义的,因为一个是数字,一个是字符串
不过,您有两个选择:
您可以使用纯文本“60”
和词法形式“70”^^xsd:double
进行字符串比较,在这种情况下,您可以使用或,这取决于您是否需要区分大小写(因为这些是数字字符的字符串,可能并不重要)李>
您可以假定纯文本“60”
具有合法的xsd:double
词法形式,进行适当的转换,然后比较“60^^xsd:double
和“70”^^xsd:double
作为带有的数字为什么要标记它?@false:可能是因为它在Lisp中使用了一个嵌入式Prolog作为知识库。@RainerJoswig:肯定超出了标记的范围。@user3061324:你确定IF
语句和变量是正确的吗?@false:为什么?嵌入式Prolog不是Prolog??var
是逻辑变量。非常感谢Joshua的回答。我的两个值都是双精度的。我发现了这个问题,因为现在我正在通过ACL客户端中的upi->value函数转换值。现在它没有给出错误,但它没有显示“TRUE”@user3061324这些值返回的upi->value
是什么?您使用什么来比较结果值?我已将double更改为integer,它返回80和60。但是,它不会给出“真实”的结果
(if (>= (?NameMatch ?threshold "true" "false")))
-------------------------------------------
(?NameMatch ?threshold "true" "false")
(if (>= ?NameMatch ?threshold) "true" "false")