设 A = {x 1 ,x 2 ,...,x n } 。我们想要计算 x i 和 x j 之间的差异,其中 x j 是 min {x∈A:x> x i } 。可以将这种表达式转换为耶拿规则吗?
答案 0 :(得分:2)
是的,您可以在Jena Rules和Jena ARQ(SPARQL的查询处理引擎)中执行此操作。
设置
我们假设您已经定义了数据的结构化表示。对于 X i ,你有一个对应于这样的对象(N3):
[ a :Entry
; :hasEntryValue 4.3
]
然后,对于您的集合 A ,您可以将其值定义为RDF集合,例如rdf:List。例如,以下N3 woudl描述了集合 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
与其关联。作为样式注释,我还引入了: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
的绑定时,查询引擎会考虑该集合的笛卡尔积,包括sameTerm(?x0, ?x1)
,因此使用FILTER( ?x0Val < ?x1Val )
提供了一种快速方法来丢弃平凡的不良绑定