gpt4 book ai didi

nested - SPARQL 使用带限制的子查询

转载 作者:行者123 更新时间:2023-12-04 03:04:03 34 4
gpt4 key购买 nike

我正在开发一个 java 应用程序,该应用程序使用 ARQ 通过 TDB 上的 Fuseki 端点执行 SPARQL 查询。

应用程序需要一个查询来返回每个人和其他出生在同一地方的人的出生地。

首先,我编写了这个 SPARQL 查询,它返回 person_ids 和每个人的出生地。

prefix fb: <http://rdf.freebase.com/ns/>
prefix fn: <http://www.w3.org/2005/xpath-functions#>
select ?person_id ?place_of_birth
where {
?person_id fb:type.object.type fb:people.person .
?person_id fb:people.person.place_of_birth ?place_of_birth_id .
?place_of_birth_id fb:type.object.name ?place_of_birth .
FILTER (langMatches(lang(?place_of_birth),"en"))
}
LIMIT 10

----------------------------------
| person_id | place_of_birth |
==================================
| fb:m.01vtj38 | "El Centro"@en |
| fb:m.01vsy7t | "Brixton"@en |
| fb:m.09prqv | "Pittsburgh"@en |
----------------------------------

之后,我添加了一个子查询( https://jena.apache.org/documentation/query/sub-select.html )添加其他出生在那里的人,但我得到了多个相关的人,我只需要一个。
prefix fb: <http://rdf.freebase.com/ns/>
prefix fn: <http://www.w3.org/2005/xpath-functions#>
select ?person_id ?place_of_birth ?other_person_id
where {
?person_id fb:type.object.type fb:people.person .
?person_id fb:people.person.place_of_birth ?place_of_birth_id .
?place_of_birth_id fb:type.object.name ?place_of_birth .
{
select ?other_person_id
where {
?place_of_birth_id fb:location.location.people_born_here ?other_person_id .
}
}
FILTER (langMatches(lang(?place_of_birth),"en"))
}
LIMIT 10

---------------------------------------------------
| person_id | place_of_birth | other_person_id |
===================================================
| fb:m.01vtj38 | "El Centro"@en | fb:m.01vtj38 |
| fb:m.01vtj38 | "El Centro"@en | fb:m.01vsy7t |
| fb:m.01vtj38 | "El Centro"@en | fb:m.09prqv |
---------------------------------------------------

我试图添加一个 LIMIT 1 子查询,但似乎不起作用(查询已执行但永远不会结束)
prefix fb: <http://rdf.freebase.com/ns/>
prefix fn: <http://www.w3.org/2005/xpath-functions#>
select ?person_id ?place_of_birth ?other_person_id
where {
?person_id fb:type.object.type fb:people.person .
?person_id fb:people.person.place_of_birth ?place_of_birth_id .
?place_of_birth_id fb:type.object.name ?place_of_birth .
{
select ?other_person_id
where {
?place_of_birth_id fb:location.location.people_born_here ?other_person_id .
}
LIMIT 1
}
FILTER (langMatches(lang(?place_of_birth),"en"))
}
LIMIT 3

有没有办法在子查询中只返回一个结果,或者我不能使用 SPARQL 做到这一点。

最佳答案

您可以对子查询使用限制

您可以在子查询中使用限制。这是一个例子:

select ?x ?y where {
values ?x { 1 2 3 4 }
{
select ?y where {
values ?y { 5 6 7 8 }
}
limit 2
}
}
limit 5

---------
| x | y |
=========
| 1 | 5 |
| 1 | 6 |
| 2 | 5 |
| 2 | 6 |
| 3 | 5 |
---------

如您所见,您从子查询中获得了两个值(5 和 6),这些值与来自外部查询的绑定(bind)相结合,我们总共获得了五行(由于限制)。

子查询首先在最里面进行评估

但是,请记住,子查询是从最内层到最外层进行评估的。这意味着在您的查询中,

select ?person_id ?place_of_birth ?other_person_id
where {
?person_id fb:type.object.type fb:people.person .
?person_id fb:people.person.place_of_birth ?place_of_birth_id .
?place_of_birth_id fb:type.object.name ?place_of_birth .
{
select ?other_person_id
where {
?place_of_birth_id fb:location.location.people_born_here ?other_person_id .
}
LIMIT 1
}
FILTER (langMatches(lang(?place_of_birth),"en"))
}
LIMIT 3

你正在寻找一个匹配
?place_of_birth_id fb:location.location.people_born_here ?other_person_id .

并通过 ?other_person_id 绑定(bind)到外部查询。外部查询的其余部分不使用 ?other_person_id , 但是,所以它对结果没有任何影响。

该怎么做

如果你只需要另一个人

The application needs a query that returns the place of birth of each person and other person that was born in the same place.



从概念上讲,您可以将其视为挑选一个人,找到他们的出生地,然后从该地出生的人中再抽取一个人。您实际上也可以这样编写查询:

select ?person_id ?place_of_birth (sample(?other_person_idx) as ?other_person_id)
where {
?person_id fb:type.object.type fb:people.person .
?person_id fb:people.person.place_of_birth ?place_of_birth_id .
?place_of_birth_id fb:type.object.name ?place_of_birth .
FILTER (langMatches(lang(?place_of_birth),"en"))
?place_of_birth_id fb:location.location.people_born_here ?other_person_idx .
filter ( ?other_person_idx != ?person_id )
}
group by ?person_id ?place_of_birth

如果您需要多个

如果每个结果需要多个“其他结果”,这是一个更棘手的问题。这就是 Nested queries in sparql with limits 中的问题。 . How to limit SPARQL solution group size? 中有一个方法可以用于此。

关于nested - SPARQL 使用带限制的子查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27061096/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com