7

次のようなことをしたい

{
    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 で 2 つの選択クエリを結合するにはどうすればよいですか?

4

2 に答える 2

13

次のように結合できます。

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
    }
}
}

( 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) }
}
于 2012-05-29T11:22:17.707 に答える
6

@ 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
        }
    }
}

?s foaf:page ?pageトリックは、 の外側に追加のトリプルを追加するだけでしたUNIONUNIONこれは明らかに冗長ですが、サブクエリで「裸」になっている場合に明らかに発生する Virtuoso バグを回避しているようです。

于 2012-05-29T18:07:23.233 に答える