在Common Lisp中比较AllegroGraph Prolog中的RDF文本

在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

我试图在知识库中比较两个三元组的对象。我通过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             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")