我试图比较知识库中两个三元组的对象我已通过ACL客户端(Allegro CL Enterprise edition 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 Objectns:hasAddressMatch ns:hasThresholdValue "60"<../729277> :hasNameMatch "70"^^xsd:double我试图比较?threshold与值"60"和?NameMatch与值"70"^^xsd:double,我期望得到结果"true"我该怎么做? 最佳答案 在RDF数据中,不为空的节点或IRIs都是文本文本可以是纯文本(没有附加信息的字符串)、带有语言标记的字符串,或者是带有数据类型(IRI)的词法形式(字符串部分)。在您的数据中,词汇表"70"的文字有一个您已经审查过的数据类型,但我假设应该是xsd:double。即,该值为"70"^^xsd:double,这是双精度浮点数70另一个文本值"60"只是一个普通文本比较这两个值是没有意义的,因为一个是数字,一个是字符串。不过,你有两个选择:您可以与普通文字CC和单词表的字符串形式进行字符串比较,在这种情况下,您将使用 >或> >,这取决于您是否希望区分大小写(因为这些是数字字符的字符串,可能没关系)。可以假定纯文本“cc>具有一个对于"60"的合法的词汇形式,进行适当的转换,然后将"70"^^xsd:double和string<作为string-lessp的数字进行比较。如果可能的话,我建议您清理数据(但如果数据来自其他地方,则这可能不是一个选项),以便您可以使用(2)中的"60"进行数值比较,但不需要在比较时进行转换。除了这些RDF问题之外,Lisp代码还存在一些问题xsd:double接受三个参数(不过,第三个参数是可选的)第一个是测试条件,第二个和第三个是根据第一个评估值是否为真来评估的表单在代码中,"60"^^xsd:double只得到一个参数:(if (>= (?NameMatch ?threshold "true" "false"))) -------------------------------------------这是试图用一个参数调用"70"^^xsd:double,这是(?NameMatch ?threshold "true" "false")这将是对名为<的函数的函数调用,带有三个参数(<、if和if)你可能想要的是:(if (>= ?NameMatch ?threshold) "true" "false")(当然,您可能仍需要按上述方式修改测试。)关于lisp - 在Common Lisp中的AllegroGraph Prolog中比较RDF文字,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20351125/
10-09 00:10