优选组合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下单。明确,;我想要以下组合列表中的第一个

我正在尝试编写一个优雅的SPARQL,它为我提供了一个解决多个可能查询的解决方案。我有很多主语和谓词,我想接收一个对象。单一解的存在是非常不确定的,因此我给出了多种选择。如果我没有弄错,可以通过以下查询完成:

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 |
-------------------------