令A = {x 1 ,x 2 ,...,x n }。我们要计算x i和x j之间的差异,其中x j是min{x ∈ A : x > x i }。有可能将这种表达式翻译成耶拿规则吗?
1 回答
是的,您可以在 Jena Rules 和 Jena ARQ(SPARQL 的查询处理引擎)中执行此操作。
设置
让我们假设您已经定义了数据的结构化表示。对于X i,您有一个对应于这样的对象(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)
]
这将要求您为查询的一部分构建一个 Jena Builtin 。对于给定的值,在特定的集合中,nextSmallest
上述规则将尝试识别元素,并且(如果成功)构造一个新节点,并通过某些特定于域的属性将 与它相关联。作为风格说明,我还引入了一个属性来跟踪该节点的来源,因此它不会作为计算结果无用。?x0
?set
nextSmallest
?x1
?calculated
?difference
:hasValue
: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
为两者中较小的一个。然后,如果它们之间存在任何对,则丢弃绑定对。查询引擎将在选择绑定时考虑集合的笛卡尔积,?x0
包括?x1
when sameTerm(?x0, ?x1)
,因此 usingFILTER( ?x0Val < ?x1Val )
提供了一种快速丢弃非常糟糕的绑定的方法。