You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何判定一个范围包含另一个范围?SPARQL或SWRL实现方法

rangeB 包含于 rangeA
你给出的测试RDF数据如下:

:rangeA :lowerLimit :LeftMarginA ;
        :upperLimit :RightMarginA .

:rangeB :lowerLimit :LeftMarginB ;
        :upperLimit :RightMarginB .

:LeftMarginA :hasValue 20 ;
:RightMarginA  :hasValue 80 .

:LeftMarginB :hasValue 30 ;
:RightMarginB  :hasValue 60 .

实现方案

方式1:SPARQL CONSTRUCT查询

直接执行以下查询即可得到你需要的包含关系三元组结果:

# 请将前缀替换为你实际使用的本体命名空间
PREFIX : <http://your-ontology-namespace#>

CONSTRUCT {
  ?rangeA :Contains ?rangeB .
}
WHERE {
  # 匹配外层区间A的上下限数值
  ?rangeA :lowerLimit ?aLower ; :upperLimit ?aUpper .
  ?aLower :hasValue ?aMin .
  ?aUpper :hasValue ?aMax .

  # 匹配内层区间B的上下限数值
  ?rangeB :lowerLimit ?bLower ; :upperLimit ?bUpper .
  ?bLower :hasValue ?bMin .
  ?bUpper :hasValue ?bMax .

  # 区间包含判断逻辑
  FILTER (?bMin >= ?aMin && ?bMax <= ?aMax)
  # 可选:过滤掉区间自身包含自身的结果
  FILTER (?rangeA != ?rangeB)
}

执行上述查询后,返回的三元组结果就包含:rangeA :Contains :rangeB。

方式2:SWRL推理规则

如果你使用支持SWRL的推理器(如HermiT、Pellet),可以将以下规则写入本体,推理器会自动生成所有符合条件的包含关系三元组:

# 若你的本体没有定义区间类Interval,可去掉前两个类判定条件
Interval(?rangeA) ∧ Interval(?rangeB)
∧ lowerLimit(?rangeA, ?aLow) ∧ hasValue(?aLow, ?aLowVal)
∧ upperLimit(?rangeA, ?aHigh) ∧ hasValue(?aHigh, ?aHighVal)
∧ lowerLimit(?rangeB, ?bLow) ∧ hasValue(?bLow, ?bLowVal)
∧ upperLimit(?rangeB, ?bHigh) ∧ hasValue(?bHigh, ?bHighVal)
∧ swrlb:greaterThanOrEqual(?bLowVal, ?aLowVal)
∧ swrlb:lessThanOrEqual(?bHighVal, ?aHighVal)
∧ swrlb:notEqual(?rangeA, ?rangeB)
→ Contains(?rangeA, ?rangeB)

将规则导入本体后开启推理,即可直接查询到:rangeA :Contains :rangeB的三元组。


内容的提问来源于stack exchange,提问作者joylix

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 02:36:03