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)我认为从代数的角度来看,丢弃排列是可能的。但是我如何申请<uris?

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 {
  ...some condition to select items...
  ?item dct:date ?date .
  ?item ... as before ...
}

条件可能是FILTER (?date > ...something...)or?item rdf:type ex:InterestingItem或其他。

在这种情况下,您可能会考虑DESCRIBE

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

这将返回(在 rdf 中)有关符合该条件的项目的信息。在这里,查询只是挑选出项目,而不是我们想知道的关于它们的事情。

于 2013-01-15T10:39:39.620 回答