3

単純なSPARQLクエリを使用してAPIをクエリします。

PREFIX ...
SELECT DISTINCT *
    WHERE {
    ?item dct:date ?date .
    ?item dct:title ?title .
    ?item rdfs:info ?info .
    }

そしてこれは私にxmlを返します

<results>
    <result>
        <binding name='title'>
            <literal>titletitle</literal>
        </binding>
        <binding name='info'>
            <uri>link</uri>
        </binding>
        <binding name='date'>
            <literal datatype='http://www.w3.org/2001/XMLSchema#dateTime'>2012-12-21T02:26:00+00:00</literal>
        </binding>
        <binding name='item'>
            <uri>link</uri>
        </binding>
    </result>
    ...
</results>

しかし、問題は次のとおりです。このアイテムに一致するrdfs:infoのリンクが複数あることはわかっています。どうすれば取得できるようにクエリできますか

...
<binding name='info'>
    <uri>link1</uri>
</binding>
<binding name='info'>
    <uri>link2</uri>
</binding>
<binding name='info'>
    <uri>link3</uri>
</binding>
...

?これは単純ですか、それともサブクエリまたは奇妙なものが必要UNIONですか?やってみたら

    PREFIX ...
SELECT DISTINCT *
    WHERE {
    ?item dct:date ?date .
    ?item dct:title ?title .
    OPTIONAL (?item rdfs:info ?info1 ).
    OPTIONAL (?item rdfs:info ?info2 ).
    }

?info1これは、との値のすべての可能な順列を返します?info2。それに、情報アイテムの数がわかりません。

を追加FILTER (?info1 != ?info2)しても、まだいくつかの順列があります。代数の観点から、FILTER (?info1 < ?info2)順列を破棄することは可能だと思います。しかし、どうすれば<URIに適用できますか?

4

1 に答える 1

2

あなたはこれを行うことはできません、私は恐れています。a SELECT(または実際には any WHERE) の結果は表形式であり、ネストされたテーブル (一部のリレーショナル データベースに見られる) やその他の適切な構造を持つことはできません。

簡単なオプションはORDER BY ?item、既存のクエリに を追加することです。これにより、少なくともすべてがまとめられるため、アイテムごとに処理できます。過去に、次のようなリレーショナル データを反復処理するラッパーを作成しました。

foreach (item: iterateOverBy(results, "item")
    foreach (date: iterateOverBy(results, "date")
        foreach (title: iterateOverBy(results, "title")
            foreach (info: iterateOverBy(results, "info")
                ...do something...

ただし、SPARQL はもちろん RDF を返すことができるため、次のように使用できます。

CONSTRUCT { ?item dct:date ?date ; dct:title ?title ; rdfs:info ?info }
WHERE ...

内部的には同じ作業を行いますが、結果には意志のように多くの繰り返しが含まれませんSELECT

私の最後の提案は、与えられた問題には適切ではありませんが、言及する必要があります。

これまでのところ、実際のクエリ処理は実際には変更されておらず、結果の形式のみが変更されています。ただし、次の形式のクエリ where を想定します。

WHERE {
  ...some condition to select items...
  ?item dct:date ?date .
  ?item ... as before ...
}

FILTER (?date > ...something...)条件はまたは、または何でもかまいません?item rdf:type ex:InterestingItem

この場合、次のことを検討してDESCRIBEください。

DESCRIBE ?item WHERE { ...some condition to select items... }

これにより、その条件に一致するアイテムに関する情報が (rdf で) 返されます。ここで、クエリは項目について知りたいことではなく、単に項目を選択します。

于 2013-01-15T10:39:39.620 に答える