两个联合在SPARQL查询中选择

Tim*_*imm 5 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
    }
}
Run Code Online (Sandbox Code Playgroud)

但这会产生语法错误.如何在SPARQL中结合两个选择查询?

use*_*512 10

你可以像这样结合他们:

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
    }
}
}
Run Code Online (Sandbox Code Playgroud)

(使用SPARQL验证器检查)

但是,对于这种情况,我认为你根本不需要子查询.例如:

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) }
}
Run Code Online (Sandbox Code Playgroud)

  • 哦,使用virtuoso(为端点提供动力)我真的不知道.他们的SPARQL支持是特殊的. (3认同)

cyg*_*gri 5

基于@ 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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

诀窍就是在?s foaf:page ?page外面添加一个额外的三元组UNION.这显然是多余的,但它似乎避免了Virtuoso错误,这显然是因为你有一个"裸" UNION的子查询.