【问题标题】:using arithmetic functions in custom GraphDB ruleset在自定义 GraphDB 规则集中使用算术函数
【发布时间】:2018-11-13 11:26:37
【问题描述】:

我想向 OWL-2-RL 规则集 (builtin_owl2-rl.pie) 添加一个自定义规则,该规则在彼此相反方向的向量之间建立 isOppositeDirectionOf 对象属性.我认为它应该看起来像这样:

Id: oppositeDirectionVector_rule
     v1 <rdf:type> <cad:Vector>
     v1 <cad:x> v1x            // example data property for v1x: "1.0"^^xsd:double
     v1 <cad:y> v1y
     v1 <cad:z> v1z
     v2 <rdf:type> <cad:Vector>
     v2 <cad:x> -v1x
     v2 <cad:y> -v1y
     v2 <cad:z> -v1z
    -------------------------------
    v1 <cad:isOppositeDirectionOf> v2

没有缺点,这条规则确实适用于创建isSameVectorAs 对象属性。 有没有办法可以在规则中的数据属性上使用基本算术函数?

【问题讨论】:

  • 我还想知道是否可以通过.pie 文件中的自定义规则创建新实例(在 Protégé 中也称为个人)。我只看到了用于在现有事物之间建立新链接的推论(规则的 ---- 行下方的内容)。
  • 我理解Constraint,但[Cut][Context] 在公理旁边是什么意思(规则的---- 行上方是什么)?我似乎无法谷歌...
  • 上下文仅用于限制一个规则的结果,如果共享相同的上下文,则输入其他规则。
  • 您使用的语法显然是错误的。考虑到像BIND 这样的东西是不可能的,我认为它目前是不可能的。或者至少,文档中没有提到它,您可以尝试它是否有效。
  • 我现在看到的唯一解决方案是使用 SPARQL 更新查询。显然,鉴于通常会进行定点迭代,因此不清楚如何将其与规则推断结合起来,因此,单个 SPARQL 查询可能会导致不完整的结果(在我看来很可能,但取决于其余数据)。在 OWL RL 物化之后运行它,然后重新运行 OWL RL 物化并比较三元存储中的三元数 - 这就是我的方式。

标签: owl rules reasoning graphdb


【解决方案1】:

您不能在规则中使用基本的算术函数。由于性能原因,GraphDB 规则引擎使用内部数据库标识符,但不是实际的 RDF 值,即内部 id 10001 而不是 "1"^^xsd:double。因此,唯一支持的变量比较操作是两个内部标识符是否相等。

按照下面的评论进行编辑GraphDB's Plugin API 是唯一将您的代码与数据库集成的机制。插件可以用?s &lt;cad:x&gt; ?o 谓词新语句?s &lt;cad:oppositeX&gt; -?o 为每个语句实现。不幸的是,它也应该处理删除。

【讨论】:

  • 我明白了,谢谢@vassil_momtchev。您认为可能有机会了解这些内部 ID 映射吗?如果一个值是"1"^^xsd:double 而另一个是它的负数版本"-1"^^xsd:double,我可以尝试使用它们来触发某些东西,方法是比较它们的内部ID,而不是实际应用算术。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多