1

我正在尝试运行在 lisp 中实现的序言规则。在 lisp 代码中,我遇到以下问题:

  1. 我从 AG 知识库查询人员,输出为字符串格式,例如

    " http://www.myweb.com/myns/Person1 " " http://www.myweb.com/myns/Person2 "

  2. 我将上面的字符串转换为 Resource 如下

(setq p1(资源“ http://www.myweb.com/myns/Person1 ”))

(setq p2(资源“ http://www.myweb.com/myns/Person2 ”))

将字符串转换为资源后,输出如下:

!ns:Person1
!ns:Person2
  1. 我以上述两个人(资源)并通过查询运行规则以查找他们之间的关系。请注意 p1 和 p2 是已知的,而 ?relation 是未知变量。查询到 AG 知识库并找到关系

    (选择不同

    (p1 关系 p2)

    (MyRulesfunction p1 ?relation p2)

    )

问题是当查询在第 2 步中使用 select-distinct 运行时。它不会将资源作为参数并抱怨 UPI 转换。我也尝试过使用(value->upi)函数转换为 UPI,但没有成功。

谁能帮帮我?我可以在 MyRulesfunction 中传递什么格式的 p1 和 p2 值来查找关系。您的帮助将不胜感激。我的规则功能定义如下:;; 如果两个人都住在同一个城市,则适用于人的规则

  (<--(MyrulesFunction ?p1 !ns:SameCityWith ?p2) 

  (q ?p1 !ns:hasCity ?city)
    (q ?p2 !ns:hasCity ?city)
    )
4

1 回答 1

0

这应该这样做:

(select-distinct ?relation (MyRulesFunction (?? p1) ?relation (?? p2)))

这 '??' 语法标记在此处的文档中进行了描述。我知道我的回答对于 OP 来说可能已经晚了 5 年,但希望有人能从中受益。

于 2020-07-03T16:43:33.173 回答