gpt4 book ai didi

sparql - 在 sparql IN 子句中使用另一个 sparql

转载 作者:行者123 更新时间:2023-12-02 05:48:52 27 4
gpt4 key购买 nike

我正在使用 SPARQL,我想知道是否可以在 in 子句中放入 sparql?更具体地说,我需要获取对此 sparql 查询具有特定条件的实体(s1,s2)[s1 在某个字段上的聚合值大于 5]

select 
?s1 ?x ?s2.
WHERE {
{?s1 rdf:type dbpedia-owl:Scientist.}
{?s2 rdf:type dbpedia-owl:Scientist.}
{?s2 dbpedia-owl:field ?x.}
{?s1 dbpedia-owl:field ?x.}
}

所以我需要添加一个像这样的额外 IN 子句

SELECT
?s1 ?x ?s2.
WHERE {
{?s1 rdf:type dbpedia-owl:Scientist.}
{?s2 rdf:type dbpedia-owl:Scientist.}
{?s2 dbpedia-owl:field ?x.}
{?s1 dbpedia-owl:field ?x.}
{?s1 IN
{
SELECT ?s1 WHERE {
SELECT ?s1 (COUNT(?p) AS ?prizes) {
?s1 dbpprop:prizes ?p.
} group by (?s1)
}FILTER (?prizes > 2)
}
}
}

但是我在 sparql 查询解析器上遇到错误......有人知道如何解决吗?

最佳答案

IN 在 SPARQL 中的用法与 SQL 有所不同,它只能在 FILTER 中使用,如下所示:

FILTER(?s IN (<this>, <that>, <another>))

但是,由于 SPARQL 评估的自下而上连接语义,仅使用子查询本身就应该给您所需的结果:

SELECT ?s1 ?x ?s2
WHERE
{
?s1 rdf:type dbpedia-owl:Scientist.
?s2 rdf:type dbpedia-owl:Scientist.
?s2 dbpedia-owl:field ?x.
?s1 dbpedia-owl:field ?x.
{
SELECT ?s1 WHERE
{
?s1 dbpprop:prizes ?p.
}
GROUP BY ?s1
HAVING (COUNT(?p) > 2)
}
}

您可能会注意到我还简化了您查询的其他一些部分。无需使用两个嵌套子查询,因为您可以使用 HAVING 子句指定聚合条件。

此外,您不需要将 { } 放在每个单独的三重模式周围,事实上这样做可能会严重损害性能。

关于sparql - 在 sparql IN 子句中使用另一个 sparql,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13650840/

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