优选组合SPARQL
我正在尝试编写一个优雅的SPARQL,它为我提供了一个解决多个可能查询的解决方案。我有很多主语和谓词,我想接收一个对象。单一解的存在是非常不确定的,因此我给出了多种选择。如果我没有弄错,可以通过以下查询完成:优选组合SPARQL,sparql,rdf,linked-data,Sparql,Rdf,Linked Data,我正在尝试编写一个优雅的SPARQL,它为我提供了一个解决多个可能查询的解决方案。我有很多主语和谓词,我想接收一个对象。单一解的存在是非常不确定的,因此我给出了多种选择。如果我没有弄错,可以通过以下查询完成: SELECT ?object WHERE { :subjA|:subjB|:subjC :propA|:propB|:propC ?object. } LIMIT 1 真正的问题是我不想要任何解决方案。我要按:subva然后按:propA下单。明确,;我想要以下组合列表中的第一个
SELECT ?object
WHERE {
:subjA|:subjB|:subjC :propA|:propB|:propC ?object.
}
LIMIT 1
真正的问题是我不想要任何解决方案。我要按:subva
然后按:propA
下单。明确,;我想要以下组合列表中的第一个解决方案:
:subva
:propA
:subva
:propB
:subva
:propC
:subgb
:propA
:subgb
:propB
:subgb
:propC
:subcc
:propA
:subcc
:propB
:subcc
:propC
如何重写我的查询以获得第一个可能的解决方案?您可以通过两种方法来完成。根据您是否需要按字母排序,它们是不同的。 首先是字母排序:
Select ?object where {
{Select (min(?sub) as ?msub) where {
?sub :propA|:propB|:propC ?obj1
Filter ( ?sub = :subjA or :sub=?...)
} .
{Select (min(?prop) as ?mrop_by_msub) where {
?msub ?prop ?obj2
Filter ( ?prop = :propA or ?prop=?...)
} .
?msub ?mrop_by_msub ?object
}
Limit 1
自定义排序的第二种方法:
Select ?object where {
{:subjA :propA ?object}
Union
{:subjA :propB ?object}
.......
} limit 1
我是用内存写的,所以这段代码可能有一些错误
添加第三种方式:
您可以向rdf存储添加如下内容:
:subjA :order_num 1
:subjB :order_num 2
:subjC :order_num 3
:propA :order_num 1
:propB :order_num 2
:propC :order_num 3
select ?object where{
?sub :order_num ?ord_num_sub .
?prop :order_num ?ord_num_prop .
?sub ?prop ?object
} order by ?ord_num_sub ?ord_num_prop
limit 1
然后使用如下查询:
:subjA :order_num 1
:subjB :order_num 2
:subjC :order_num 3
:propA :order_num 1
:propB :order_num 2
:propC :order_num 3
select ?object where{
?sub :order_num ?ord_num_sub .
?prop :order_num ?ord_num_prop .
?sub ?prop ?object
} order by ?ord_num_sub ?ord_num_prop
limit 1
或者,如果您想使用不同的主题和道具,可以添加过滤器:
过滤器((?ord_num_sub=2或?ord_num_sub=3)和(?ord_num_prop=1或?ord_num_prop=2))这肯定不是有效的SPARQL查询。您只能对谓词使用
|
,该谓词随后将被称为属性路径,但您将丢失变量绑定
SPARQL返回一组行,但您可以使用例如字典顺序。不确定,如果这是您想要的:
样本数据
更新
由于需要使用已定义的顺序,因此可以使用实体索引作为解决方法(我分别更改了:subgb
和:subcc
的顺序。:propB
和:propC
,以显示与词典顺序相比的差异):
查询
前缀:
选择s?p?o
哪里
{VALUES(?sid?s){(1:subca)(2:subcc)(3:subcb)}
值(?pid?p){(1:propA)(2:propC)(3:propB)}
?s?p?o
}
按?sid?pid订购
结果
谢谢你的回复。我不想要字母排序,而是没有任何模式的自定义排序。工会是按既定顺序返回的,这是既定事实吗?尽管如此,如果是这样,这将导致一个非常长的查询,因为我希望有5-10个主题和5-10个属性。谢谢,但由于我无法编辑数据集,AKSW的解决方案被接受为最佳解决方案。感谢您的回复。这个解决方案很优雅,但我不想按字母顺序排序,而是手动排序。这可能吗?有一个小的解决办法,是的。看看我更新的答案。这个解决方案看起来很完美!非常感谢。
-------------------------
| s | p | o |
=========================
| :subjA | :propA | :o1 |
| :subjA | :propC | :o1 |
| :subjA | :propC | :o2 |
| :subjC | :propB | :o1 |
| :subjC | :propA | :o1 |
| :subjB | :propB | :o1 |
| :subjB | :propB | :o2 |
| :subjB | :propC | :o2 |
-------------------------