SPARQL 如果一个实例有 属性,其他实例也必须

SPARQL if an instance has a property, others must as well

我有一个特定实例和一个 SPARQL 查询,用于检索与该实例类似的其他实例。类似地,我的意思是其他实例至少有一个共同的 属性 和与特定实例共同的值,或者具有与特定实例共同的 class.

现在,我想扩展查询,如果特定实例具有 "critical" 属性 的值,那么唯一被认为相似的实例是 有那个关键 属性(而不是只有至少一个 属性 和共同价值)。

例如,这里有一些示例数据,其中 instance1 的值 predicate2isCriticalPredicate 的子 属性。

@prefix : <http://example.org/rs#>
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>

:instance1  a   :class1.
:instance1  :predicate1 :instance3.
:instance1  :predicate2 :instance3.  # (@) critical property

:instance2  a   :class1.
:instance2  :predicate1 :instance3.

:instance4  :predicate2 :instance3.

:predicate1 :hasSimilarityValue 0.6.

:predicate2 rdfs:subPropertyOf   :isCriticalPredicate.
:predicate2 :hasSimilarityValue 0.6.

:class1 :hasSimilarityValue 0.4.

这是一个查询,其中 ?x 是特定实例 instance1。查询只检索 instance4,这是正确的。但是,如果我从 instance1(标记为 @ 的行)中删除关键的 属性,我不会得到任何结果,但应该会得到 instance2,因为它与 instance1 有一个共同点 属性。我该如何解决这个问题?

PREFIX : <http://example.org/rs#>

select ?item (SUM(?similarity * ?importance * ?levelImportance) as ?summedSimilarity) 
(group_concat(distinct ?becauseOf ; separator = " , ") as ?reason) where
{
  values ?x {:instance1}
  bind (4/7 as ?levelImportance)
  {
    values ?instanceImportance {1}
    ?x  ?p  ?instance.
    ?item   ?p  ?instance.
    ?p  :hasSimilarityValue ?similarity
      bind (?p as ?becauseOf)
    bind (?instanceImportance as ?importance)
  }
  union
  {
      values ?classImportance {1}
    ?x  a   ?class.
    ?item   a   ?class.
    ?class  :hasSimilarityValue ?similarity
      bind (?class as ?becauseOf)
        bind (?classImportance as ?importance)
  }
  filter (?x != ?item)

    ?x :isCriticalPredicate ?y.
    ?item   :isCriticalPredicate ?y.

}
group by ?item

我已经说过了,我再说一遍:最少的数据非常有帮助。从您过去的问题中,我知道您的工作项目在属性等方面具有相似性值,但是 none 对于手头的问题来说确实很重要。这里有一些数据只有几个实例,属性 个值,一个 属性 被指定为关键:

@prefix : <urn:ex:>

:p a :criticalProperty .

:a :p :u ;   #-- :a has a critical property, so 
   :q :v .   #-- only :d can be similar to it.

:c :q :v ;   #-- :c has no critical properties, so
   :r :w .   #-- both :a and :d can be similar to it.

:d :p :u ;
   :q :v .

像这样的查询中的诀窍是过滤掉有问题的结果,而不是尝试 select 没有问题的结果。从逻辑上讲,它们的意思是一样的,但是在编写查询时,更容易考虑违反约束,并尝试过滤掉违反约束的结果。在这种情况下,您想过滤掉实例具有关键 属性 和值但相似实例没有的任何结果。

prefix : <urn:ex:>

select ?i (group_concat(distinct ?j) as ?js) where {

  #-- :a has a critical property, but
  #-- :c does not, so these are useful
  #-- starting points
  values ?i { :a :c }

  #-- get ?j instances that have a value
  #-- in common with ?i.
  ?i ?property ?value .
  ?j ?property ?value .

  #-- make sure that ?i and ?j aren't
  #-- the same instance
  filter (?i != ?j)

  #-- make sure that there is no critical
  #-- property value that ?i has that
  #-- ?j does not also have
  filter not exists {
    ?i ?criticalProperty ?criticalValue .
    ?criticalProperty a :criticalProperty .
    filter not exists {
      ?j ?criticalProperty ?criticalValue .
    }
  }
}
group by ?i
----------------------------
| i  | js                  |
============================
| :a | "urn:ex:d"          |
| :c | "urn:ex:d urn:ex:a" |
----------------------------

相关

还有一些其他问题也涉及到 containt satisfaction/violation,阅读这些问题可能会有用。虽然并非所有这些都使用嵌套 filter not exists,但它们中的大多数确实具有 filter not exists { … filter } 的模式.

  • (这实际上使用了一个嵌套的 过滤器不存在。)
  • Is it possible to express a recursive definition in SPARQL?
  • Count values that satisfy a constraint and return 0 for those that don't satisfy it in SPARQL
  • SPARQL: return all intersections fulfilled by specified or equivalent classes(在答案的最后一个查询中还有另一个嵌套的 过滤器不存在。)