具有相同属性的个人的SPARQL查询
我想确定所有与其他个体具有相同属性的个体。想象一下,有不同的购物清单,上面有不同的物品,你可以购买或租赁(对象属性)。为了让事情变得更复杂,我还想为停车和行驶一定距离(数据属性)支付确切的费用。同时,有不同的商店提供不同的商品。 作为一个懒惰的人,我想确定每个列表中提供列表中所有项目的商店 我相信这是一个概括,但不知何故,我不知道如何做到这一点 我创建了一些个人样本:具有相同属性的个人的SPARQL查询,sparql,rdf,owl,ontology,Sparql,Rdf,Owl,Ontology,我想确定所有与其他个体具有相同属性的个体。想象一下,有不同的购物清单,上面有不同的物品,你可以购买或租赁(对象属性)。为了让事情变得更复杂,我还想为停车和行驶一定距离(数据属性)支付确切的费用。同时,有不同的商店提供不同的商品。 作为一个懒惰的人,我想确定每个列表中提供列表中所有项目的商店 我相信这是一个概括,但不知何故,我不知道如何做到这一点 我创建了一些个人样本: @prefix : <http://www.shopping.org/model#> . @prefix owl:
@prefix : <http://www.shopping.org/model#> .
@prefix owl: <http://www.w3.org/2002/07/owl#> .
@prefix rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#> .
@prefix xml: <http://www.w3.org/XML/1998/namespace> .
@prefix xsd: <http://www.w3.org/2001/XMLSchema#> .
@prefix rdfs: <http://www.w3.org/2000/01/rdf-schema#> .
@base <http://www.shopping.org/model> .
<http://www.shopping.org/model> rdf:type owl:Ontology .
# Object Properties
:buy rdf:type owl:ObjectProperty .
:rent rdf:type owl:ObjectProperty .
# Data properties
:distance rdf:type owl:DatatypeProperty .
:parking rdf:type owl:DatatypeProperty .
# Classes
:Product rdf:type owl:Class .
:ShoppingList rdf:type owl:Class .
:Store rdf:type owl:Class .
# Individuals
:Apples rdf:type owl:NamedIndividual ,
:Product .
:Cereal rdf:type owl:NamedIndividual ,
:Product .
:List1 rdf:type owl:NamedIndividual ,
:ShoppingList ;
:buy :Apples ,
:Milk ;
:distance "9.0"^^xsd:float ;
:parking "10.0"^^xsd:float .
:List2 rdf:type owl:NamedIndividual ,
:ShoppingList ;
:buy :Cereal ,
:Milk ;
:rent :TV ;
:distance "5.0"^^xsd:float ;
:parking "10.0"^^xsd:float .
:Milk rdf:type owl:NamedIndividual ,
:Product .
:Store1 rdf:type owl:NamedIndividual ,
:Store ;
:buy :Apples ,
:Cereal ,
:Milk ,
:TV ;
:distance "9.0"^^xsd:float ;
:parking "10.0"^^xsd:float .
:Store2 rdf:type owl:NamedIndividual ,
:Store ;
:buy :Cereal ,
:Milk ;
:rent :TV ;
:distance "5.0"^^xsd:float ;
:parking "10.0"^^xsd:float .
:TV rdf:type owl:NamedIndividual ,
:Product .
# General axioms
[ rdf:type owl:AllDisjointClasses ;
owl:members ( :Product
:ShoppingList
:Store
)
] .
@前缀:。
@前缀owl:。
@前缀rdf:。
@前缀xml:。
@前缀xsd:。
@前缀rdfs:。
@基地。
rdf:type owl:Ontology。
#对象属性
:buy rdf:type owl:ObjectProperty。
:rent rdf:type owl:ObjectProperty。
#数据属性
:距离rdf:type owl:DatatypeProperty。
:停车场rdf:type owl:DatatypeProperty。
#班级
:Product rdf:type owl:Class。
:ShoppingList rdf:type owl:Class。
:Store rdf:type owl:Class。
#个人
:Apples rdf:type owl:NamedIndividual,
:产品。
:谷物rdf:type owl:NamedIndividual,
:产品。
:List1 rdf:type owl:NamedIndividual,
:购物清单;
字体购买:苹果,
:牛奶;
:距离“9.0”^^xsd:float;
:驻车“10.0”^^xsd:float。
:List2 rdf:type owl:NamedIndividual,
:购物清单;
当前位置购买:谷物,
:牛奶;
:租金:电视;
:距离“5.0”^^xsd:浮动;
:驻车“10.0”^^xsd:float。
:Milk rdf:type owl:NamedIndividual,
:产品。
:Store1 rdf:type owl:NamedIndividual,
:商店;
字体购买:苹果,
:谷物,
:牛奶,
:电视;
:距离“9.0”^^xsd:float;
:驻车“10.0”^^xsd:float。
:Store2 rdf:type owl:NamedIndividual,
:商店;
当前位置购买:谷物,
:牛奶;
:租金:电视;
:距离“5.0”^^xsd:浮动;
:驻车“10.0”^^xsd:float。
:TV rdf:type owl:NamedIndividual,
:产品。
#一般公理
[rdf:type owl:AllDisjointClass;
owl:成员(:产品)
:购物清单
:商店
)
] .
并尝试了一些最初的查询。这是我最好的:
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX owl: <http://www.w3.org/2002/07/owl#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX xsd: <http://www.w3.org/2001/XMLSchema#>
PREFIX : <http://www.shopping.org/model#>
SELECT DISTINCT ?list ?store ?prop
WHERE {
?list a :ShoppingList .
?store a :Store .
?list ?prop [] .
FILTER NOT EXISTS {
?list ?prop ?value .
FILTER NOT EXISTS {
?store ?prop ?value .
}
}
}
ORDER BY ?list ?store
前缀rdf:
前缀owl:
前缀rdfs:
前缀xsd:
前缀:
选择不同的?列表?存储?道具
在哪里{
?清单a:购物清单。
商店a:商店。
?列表?项目[]。
筛选器不存在{
?列表?道具?值。
筛选器不存在{
存储道具值。
}
}
}
按?列表?商店订购
但是,此查询返回所有门店和列表的组合,因为每个门店的停车费为10.0 F。
如何仅筛选满足列表要求的所有商店?
另一个假设是,可能存在除购买和租赁之外的其他商业模式,以及其他标准,即数据属性,这些都是值得关注的。这就是为什么我不想指定这些属性,而是想使用变量
此查询实现了我的目标:
PREFIXES [as above]
PREFIX : <http://www.shopping.org/model#>
SELECT DISTINCT ?list ?store
WHERE {
?list a :ShoppingList .
?store a :Store .
FILTER NOT EXISTS {
?compat a owl:DatatypeProperty
FILTER NOT EXISTS {
?list ?compat ?value .
?store ?compat ?value .
}
}
FILTER NOT EXISTS {
?subset a owl:ObjectProperty .
?list ?subset ?value .
FILTER NOT EXISTS {
?store ?subset ?value .
}
}
}
ORDER BY ?list ?store
前缀[如上所述]
前缀:
选择不同的列表存储
在哪里{
?清单a:购物清单。
商店a:商店。
筛选器不存在{
?兼容owl:DatatypeProperty
筛选器不存在{
?列出兼容值。
存储兼容值。
}
}
筛选器不存在{
?owl:ObjectProperty的子集。
?列表?子集?值。
筛选器不存在{
存储子集值。
}
}
}
按?列表?商店订购
我的错误实际上只是在过滤器外定义了?道具。这导致它们成为解决方案的一部分,也就是说,我无法通过过滤器删除整个存储。如果您愿意具体说明这些东西需要共同拥有的特定属性,您可以这样做。我已经清理了你的数据,因为它实际上没有必要的前缀声明如果您希望人们能够使用您提供的内容,请包含完整的数据。我没有添加正确的前缀,但只足以让事情正常进行 样本数据 一般方法 通常情况下,从消除你不想要的结果的角度来思考是有帮助的。在本例中,您有两种属性:(i)其中个体必须具有兼容值的属性,以及(ii)其中一个个体必须具有另一个个体的值的超集的属性。检查这些条件中是否有一个不适用并不难:
前缀:
选择?列表?存储{
#--对于每个列表和存储
?清单a:购物清单。
商店a:商店。
#--检查每个“兼容属性”?compat,
#--列表和
#--商店有共同点。
筛选器不存在{
值?兼容{:距离:停车}
筛选器不存在{
?列出兼容值。
存储兼容值。
}
}
#--检查每个“子集属性”?子集,
#--列表中没有包含该值的值
#--这家商店没有。
筛选器不存在{
值?子集{:购买:租赁}
?列表?子集?值
筛选器不存在{
存储子集值
}
}
}
结果(相同)
实际上,您提到的解决方案只有在绑定属性时才起作用。例如,使用
WHERE{VALUES?prop{:buy}…
否则,您必须考虑另一种方法solution@AKSW谢谢您的意见。您所说的“其他解决方案”是指另一种查询方式还是另一种查询方式
@prefix : <urn:ex:> .
@prefix owl: <file:///home/taylorj/tmp/data.ttl> .
@prefix xsd: <file:///home/taylorj/tmp/data.ttl> .
:Store1 a owl:NamedIndividual , :Store ;
:buy :Apples , :Cereal , :Milk , :TV ;
:distance "9.0"^^owl:float ;
:parking "10.0"^^owl:float .
:List2 a owl:NamedIndividual , :ShoppingList ;
:buy :Cereal , :Milk ;
:distance "5.0"^^owl:float ;
:parking "10.0"^^owl:float ;
:rent :TV .
:List1 a owl:NamedIndividual , :ShoppingList ;
:buy :Apples , :Milk ;
:distance "9.0"^^owl:float ;
:parking "10.0"^^owl:float .
:Store2 a owl:NamedIndividual , :Store ;
:buy :Cereal , :Milk ;
:distance "5.0"^^owl:float ;
:parking "10.0"^^owl:float ;
:rent :TV .
--------------------
| list | store |
====================
| :List1 | :Store1 |
| :List2 | :Store2 |
--------------------
--------------------
| list | store |
====================
| :List1 | :Store1 |
| :List2 | :Store2 |
--------------------