在上一个问题中
SPARQL if an instance has a property, others must as well
我问过,如果我有一个具有特定谓词值的实例,那么我的sparql查询的所有输出必须具有相同谓词的相同值。
我在那里得到了很好的答案,
现在我正在尝试扩展它,因为我找到了一个新的场景,
新方案是:
如果实例具有特定谓词的值,则所有输出项必须具有相同谓词的相同值,或者如果它们具有其他值,则这两个值必须为来自同一个班级
我将sparql查询扩展到以下内容:
PREFIX : <http://example.org/rs#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
select ?item ?predicate ?similarity where
{
values ?x {:instance1}
?x ?predicate ?value.
?item ?predicate ?value.
?predicate :hasSimilarityValue ?similarity.
filter (?x != ?item)
filter not exists {
?x ?p ?v1.
?v1 a ?class.
?p rdfs:subPropertyOf :isCriticalPredicate.
filter not exists {
?item ?p ?v2.
?p rdfs:subPropertyOf :isCriticalPredicate.
?v2 a ?class.
?class rdfs:subClassOf :ImportantClass
}
}
}
这是我的数据:
@prefix : <http://example.org/rs#>
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#>
:instance1 :p1 :value1.
:instance2 :p1 :value2.
:p1 :hasSimilarityValue 0.5.
:value1 a :class1.
:value2 a :class1.
:class1 rdfs:subClassOf :ImportantClass.
:p1 rdfs:subPropertyOf :isCriticalPredicate.
但结果总是空的我不知道为什么。
通过特定谓词,我的意思是谓词rdfs:subClassOf:isCriticalPredicate
通过特定的类,我的意思是那个是rdfs的类:subClassOf:ImportantClass
答案 0 :(得分:2)
正如所写,这是一个非常简单的问题:实际上没有与您编写的查询相匹配的数据。因此,我不认为数据和查询真实地重现了您所描述的问题。您的查询以
开头 values ?x {:instance1}
?x ?predicate ?value.
?item ?predicate ?value.
filter (?x != ?item)
您的数据有:
:instance1 :p1 :value1.
:instance2 :p1 :value2.
?instance没有可能的值。唯一的候选者是:instance2,但它没有与instance1共同的任何值,因此没有?值的候选者。
现在,尽管所写的问题确实没有你所描述的问题,但我认为我看到了你所问的问题。当您尝试为调试过程创建最少的数据时,应尝试包含所有相关案例。在这种情况下,您希望至少具有对于关键谓词具有相同值的实例,以及对于关键谓词具有不同值但两个值都很重要的实例。这是一些数据:
@prefix : <urn:ex:>
:instance1 :p :v1 .
:instance1 :q :v2 .
:instance2 :p :v1 .
:instance2 :q :v2 . #-- same value for :q
:instance3 :p :v1 .
:instance3 :q :v3 . #-- different, but important, value for :q
:instance4 :p :v1 .
:instance4 :q :v4 . #-- different, non-important, value for :q
:q a :CriticalPredicate .
:v2 a :ImportantValue .
:v3 a :ImportantValue .
鉴于您已经处理过的查询,我认为这个问题会比较清楚。它与你已经拥有的东西没什么不同。
prefix : <urn:ex:>
select distinct ?item where {
values ?x { :instance1 }
?x ?predicate ?value .
?item ?predicate ?value .
filter (?x != ?item)
#-- Exclude any results where
#-- ?x has a value ?v1 for a
#-- critical predicate ?p...
filter not exists {
?x ?p ?v1 .
?p a :CriticalPredicate .
#-- ...unless either ?item has
#-- the same value ?v1 for the
#-- predicate ?p, or ?item has
#-- another value ?v2 and both
#-- ?v1 and ?v2 are
#-- :ImportantValues.
filter not exists {
{ ?item ?p ?v1 }
union
{ ?item ?p ?v2 .
:ImportantValue ^a ?v1, ?v2 . }
}
}
}
--------------
| item |
==============
| :instance2 |
| :instance3 |
--------------