首选组合 SPARQL

Preferred combination SPARQL

我正在尝试编写一个优雅的 SPARQL,为多个可能的查询提供一个解决方案。我有许多主题和谓词,我想接收一个对象。单一解决方案的存在是非常不确定的,所以我给出了多个选项。如果我没记错的话,这可以通过以下查询来完成:

SELECT ?object
WHERE {
    :subjA|:subjB|:subjC :propA|:propB|:propC ?object.
}
LIMIT 1

真正的问题是我不想要任何解决方案。我想按 :subjA 然后 :propA 排序。说清楚;我想要以下组合列表中的第一个解决方案:

如何重写我的查询以获得第一个可能的解决方案?

您可以通过两种方式完成。它们因您是否需要按字母顺序排序而有所不同。 首先进行字母排序:

 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

或者如果你想使用不同的 subjs 和 props 你可以添加过滤器: 过滤器((?ord_num_sub=2 或?ord_num_sub=3)和(?ord_num_prop=1 或?ord_num_prop=2))

这肯定不是有效的 SPARQL 查询。您只能将 | 用于谓词,然后将其称为 属性 路径,但您正在丢失变量绑定。

SPARQL returns 一组行,但您可以使用例如字典顺序。不确定,如果这是你想要的:

示例数据

@prefix : <http://ex.org/> .

:subjA :propA :o1 .
:subjA :propC :o1 .
:subjB :propB :o1 .
:subjC :propB :o1 .
:subjC :propA :o1 .
:subjA :propC :o2 .
:subjB :propB :o2 .
:subjB :propC :o2 .

查询

PREFIX : <http://ex.org/>
SELECT  ?s ?p ?o
WHERE
  { VALUES ?s { :subjA :subjB :subjC }
    VALUES ?p { :propA :propB :propC }
    ?s  ?p  ?o
  }
ORDER BY ?s ?p

结果

-------------------------
| s      | p      | o   |
=========================
| :subjA | :propA | :o1 |
| :subjA | :propC | :o1 |
| :subjA | :propC | :o2 |
| :subjB | :propB | :o1 |
| :subjB | :propB | :o2 |
| :subjB | :propC | :o2 |
| :subjC | :propA | :o1 |
| :subjC | :propB | :o1 |
-------------------------

更新

由于需要使用定义的顺序,作为解决方法,可以使用实体索引(我更改了 :subjB:subjC 的顺序。 :propB:propC 以显示与字典顺序相比的差异):

查询

PREFIX : <http://ex.org/>
SELECT  ?s ?p ?o
WHERE
  { VALUES (?sid ?s) { (1 :subjA) (2 :subjC) (3 :subjB) }
    VALUES (?pid ?p) { (1 :propA) (2 :propC) (3 :propB) }
    ?s  ?p  ?o
  }
ORDER BY ?sid ?pid

结果

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