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中实现,他们喜欢让我们很难实现。。。!