SPARQL查询中两个选择的并集

SPARQL查询中两个选择的并集,sparql,dbpedia,Sparql,Dbpedia,我想做点像 { SELECT ?page, "A" AS ?type WHERE { ?s rdfs:label "Microsoft"@en; foaf:page ?page } } UNION { SELECT ?page, "B" AS ?type WHERE { ?s rdfs:label "Apple"@en; foaf:page ?page } }

我想做点像

{
    SELECT ?page, "A" AS ?type WHERE 
    {
         ?s rdfs:label "Microsoft"@en;
            foaf:page ?page
    }
}
UNION
{
    SELECT ?page, "B" AS ?type WHERE 
    {
         ?s rdfs:label "Apple"@en;
            foaf:page ?page
    }
}

但这会产生语法错误。如何在SPARQL中合并两个select查询?

您可以这样合并它们:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT * WHERE
{ 
{
    SELECT ?page ("A" AS ?type) WHERE 
    {
         ?s rdfs:label "Microsoft"@en;
            foaf:page ?page
    }
}
UNION
{
    SELECT ?page ("B" AS ?type) WHERE 
    {
         ?s rdfs:label "Apple"@en;
            foaf:page ?page
    }
}
}
前缀rdfs:
前缀foaf:
选择*WHERE
{ 
{
选择页面(“A”AS“类型),其中
{
?s rdfs:标签为“微软”@en;
foaf:第页?第页
}
}
联合
{
选择页面(“B”作为类型),其中
{
?s rdfs:标签为“苹果”@en;
foaf:第页?第页
}
}
}
(请与管理员核对)

然而,我认为对于这种情况,您根本不需要子查询。例如:

PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>
PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT ?page ?type WHERE
{
    ?s foaf:page ?page .
    { ?s rdfs:label "Microsoft"@en . BIND ("A" as ?type) }
    UNION
    { ?s rdfs:label "Apple"@en . BIND ("B" as ?type) }
}
前缀rdfs:
前缀foaf:
选择?页面?键入位置
{
s foaf:第页?第页。
{s rdfs:label“Microsoft”@en.BIND(“A”as?type)}
联合
{s rdfs:label“Apple”@en.BIND(“B”as?type)}
}

根据@user205512的答案,这里有一个适用于Virtuoso的:

SELECT * {
    ?s foaf:page ?page .
    {
        SELECT ?page ("A" AS ?type) {
            ?s rdfs:label "Microsoft"@en;
               foaf:page ?page
        }
    } UNION {
        SELECT ?page ("B" AS ?type) {
            ?s rdfs:label "Apple"@en;
               foaf:page ?page
        }
    }
}

诀窍就是在
联合体
之外添加一个额外的
foaf:page?page
三重。这显然是多余的,但它似乎避免了Virtuoso bug,这显然是由于子查询的“裸”
UNION
造成的。

这给了我这个错误:“SPARQL编译器:内部错误:ssg_print_equiv_retval_expn():select selid超出了范围。”我正在尝试让它工作,哦,Virtuoso(哪个为该端点提供了动力)我真的不知道。他们的SPARQL支持非常独特。感谢您的帮助,由于一个virtuoso bug,您的第一个查询在dbpedia中似乎无法工作,BIND似乎没有在virtuoso中实现,他们喜欢让我们很难实现。。。!