我想做点什么
{
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)
基于@ 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的子查询.