java - 从数学表达式到耶拿规则

标签 java rdf jena jena-rules

A = {x1,x2,…,xn}。我们想要计算 xixj 之间的差异,其中 xj min{x ∈ A : x > xi }。是否可以将这种表达式翻译成耶拿规则?

最佳答案

是的,您可以在 Jena Rules 和 Jena ARQ(SPARQL 的查询处理引擎)中执行此操作。

设置

假设您已经定义了数据的结构化表示。对于 Xi,您有一个与以下内容相对应的对象 (N3):

[ a :Entry
; :hasEntryValue 4.3
]

然后,对于您的集合 A,您可以将其值定义为 RDF 集合,例如 rdf:List 。例如,下面的 N3 将描述集合A={4.3, 4.2}

[ a :Set
; dct:identifier "A"
; entries ( [  a :Entry
            ;  :hasEntryValue 4.3
            ][ a :Entry
            ;  :hasEntryValue 4.2
            ] )
] .

耶拿规则

在耶拿规则中,您可以编写以下内容:

[calculate: ( ?set rdf:type :Set ),
            ( ?set rdfs:member ?x0 ),
            nextSmallest( ?set ?x0 ?x1 ),
            makeSkolem( ?calculated ?x0 ?set),
            difference( ?difference ?x0 ?x1)
            -> (?calculated :hasValue ?difference),
               (?calculated :derivedFrom ?x0),
               (?calculated :derivedFrom ?x1)
]

这需要您 construct a Jena Builtin对于nextSmallest查询的一部分。对于给定值,上述规则为 ?x0 ,在特定集合内,?set ,尝试识别nextSmallest元素,?x1 ,并且(如果成功)构造一个新节点 ?calculated并关联?difference通过一些特定领域的方式来使用它 :hasValue属性(property)。作为风格说明,我还介绍了 :derivedFrom属性以便跟踪该节点来自哪里,这样它就不会作为计算结果无用。

在 ARQ/SPARQL 中

第一个问题是您是否希望结果与数据一起出现在图表中(如基于规则的方法),或者您只是想要结果。如果您只想要结果,您可以选择结果是否采用图表形式。最简单的方法就是简单地 SELECT结果:

SELECT ?set ?x0Val (BIND(?x1Val-?x0Val) AS ?difference) WHERE {
    ?set rdf:type :Set .
    ?set rdfs:member ?x0 .
    ?set rdfs:member ?x1 .
    ?x0 :hasEntryValue ?x0Val .
    ?x1 :hasEntryValue ?x1Val .
    FILTER( ?x0Val < ?x1Val )
    FILTER NOT EXISTS {
        ?set rdfs:member ?otherEntry .
        ?otherEntry :hasEntryValue ?otherVal .
        FILTER( ?x0Val < ?otherVal && ?otherVal < ?x1Val ) .
    }
}

上面的查询是我凭空想到的,所以可能需要一些调整。其要点是检索集合中的任意两个成员,并将它们定向为 ?x0是两者中较小的一个。然后,如果绑定(bind)对之间存在任何对,则将其丢弃。在为 ?x0 选择绑定(bind)时,查询引擎将考虑该集合的笛卡尔积。和?x1包括当 sameTerm(?x0, ?x1) ,所以使用 FILTER( ?x0Val < ?x1Val )提供了一种快速方法来丢弃非常糟糕的绑定(bind)。

关于java - 从数学表达式到耶拿规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26358919/

相关文章:

java xml 到对象

java - 使用 JOOQ 读取 ora_rowscn

java - 从 RDF 节点拉出字符串

graph - 尝试提交事务时,Jena 的 TDB 数据集出现 TDBTransactionException

java - 耶拿 - 如何将资源链接到属性?

java - Jena API - 使用 listClasses() 过滤要返回的类

java - Scala 图像调整大小和裁剪

java - 在 Java 中需要一些有关数组构造函数和比较数组结果的帮助

sparql - 如何将 4 列 N-Quad 四元组导入和查询到 Blazegraph?

uri - RDF 中使用的 URI 中是否允许使用 "query string"?