首选组合 SPARQL
Preferred combination SPARQL
我正在尝试编写一个优雅的 SPARQL,为多个可能的查询提供一个解决方案。我有许多主题和谓词,我想接收一个对象。单一解决方案的存在是非常不确定的,所以我给出了多个选项。如果我没记错的话,这可以通过以下查询来完成:
SELECT ?object
WHERE {
:subjA|:subjB|:subjC :propA|:propB|:propC ?object.
}
LIMIT 1
真正的问题是我不想要任何解决方案。我想按 :subjA
然后 :propA
排序。说清楚;我想要以下组合列表中的第一个解决方案:
:subjA
:propA
:subjA
:propB
:subjA
:propC
:subjB
:propA
:subjB
:propB
:subjB
:propC
:subjC
:propA
:subjC
:propB
:subjC
: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
或者如果你想使用不同的 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 |
-------------------------
我正在尝试编写一个优雅的 SPARQL,为多个可能的查询提供一个解决方案。我有许多主题和谓词,我想接收一个对象。单一解决方案的存在是非常不确定的,所以我给出了多个选项。如果我没记错的话,这可以通过以下查询来完成:
SELECT ?object
WHERE {
:subjA|:subjB|:subjC :propA|:propB|:propC ?object.
}
LIMIT 1
真正的问题是我不想要任何解决方案。我想按 :subjA
然后 :propA
排序。说清楚;我想要以下组合列表中的第一个解决方案:
:subjA
:propA
:subjA
:propB
:subjA
:propC
:subjB
:propA
:subjB
:propB
:subjB
:propC
:subjC
:propA
:subjC
:propB
:subjC
: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
或者如果你想使用不同的 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 |
-------------------------