【问题标题】:converting freebase MQL to SPARQL将 freebase MQL 转换为 SPARQL
【发布时间】:2015-02-07 09:25:48
【问题描述】:

按照 freebase MQL 查找 5 位艺术家和每位艺术家的 50 张专辑。

[{
  "type" : "/music/artist",
  "name":null,
  "album" : [{
    "name" : null,
    "count":null,
    "limit":50
  }],
  "limit":5
}]

第一次尝试 - 没有子查询

我可以这样写 SPARQL:

SELECT ?artist ?album
WHERE
{
    ?artist :type :/music/artist .
    ?artist :album ?album
}
LIMIT n

但是,我不知道应该指定多少个n,因为据我所知,SPARQL 没有层次结构。

第二次尝试 - 使用子查询(不确定这是否正确)

以下子查询看起来可以工作。

SELECT ?artist ?album
WHERE
{
    ?artist :album ?album .
    {
        SELECT ?artist
        WHERE
        {
            ?artist :type :/music/artist
        }
        LIMIT k
    }
}
LIMIT n

但我不知道如何指定kn 来为 5 位艺术家获得 50 张专辑。

一些带有端点的数据

谁能写SPARQL 打印 5 位艺术家和他们的 5 幅画为每位艺术家?

以下查询打印艺术家和他们的绘画,但没有LIMITing 结果。

PREFIX dbpedia-owl:<http://dbpedia.org/ontology/>
PREFIX prop:<http://dbpedia.org/property/>

SELECT ?painting ?artist
WHERE
{
    ?painting prop:artist ?artist .
    {
        SELECT ?artist
        {
            ?artist rdf:type dbpedia-owl:Artist.
        }
    }
}

谢谢。

【问题讨论】:

  • 您是在问如何获取 n 个艺术家,每个艺术家最多有 k 个结果?
  • 如果是这种情况,请查看(可能重复,但也没有答案):Nested queries in sparql with limits,并查看有关该问题的 cmets,包括其他问题的链接网站。但是,answers.semanticweb.com 现在已关闭,请参阅 How to limit SPARQL solution group size?SPARQL INNER LIMIT
  • @JoshuaTaylor 感谢您提供良好的资源。最后两个链接对我帮助很大。我发现我的sub-query 是错误的(与内部查询和外部查询混淆)并且使用 SPARQL 很难做到这一点。谢谢。

标签: rdf sparql semantic-web freebase mql


【解决方案1】:

Max 和我在a chat 进行了一些讨论,这最终可能与 Max 采用的方法相同。不过,我认为它更具可读性。它有 15 位艺术家的专辑,每个艺术家最多 5 张专辑。如果您希望能够在没有任何专辑的情况下包含艺术家,则需要将某些部分设为可选。

select ?artist ?album {
  #-- select 15 bands that have albums (i.e., 
  #-- such that they are the artist *of* something).
  {
    select distinct ?artist { 
      ?artist a dbpedia-owl:Band ;
              ^dbpedia-owl:artist []
    }
    limit 15
  }

  #-- grab ordered pairs (x,y) (where y > x) of their
  #-- albums.  By asking how many x's for each y, we
  #-- get just the first n y's.
  ?artist ^dbpedia-owl:artist ?album, ?album_
  filter ( ?album_ <= ?album ) 
}
group by ?artist ?album
having count(?album_) <= 5 #-- take up 5 albums for each artist
order by ?artist ?album

SPARQL results

【讨论】:

  • 它可能同样有效并且看起来更简单但仍然看起来很尴尬......唉,除了运行两个不同的查询之外别无他法(如果连接应该发生在空白节点上,这可能无效)跨度>
  • 测试了一下,结果符合预期,评价也快了很多,我会记住这个模式。也许这个问题应该重命名为“SPARQL co-related (sub)queries with limits”之类的东西,以供将来参考。
【解决方案2】:

根据您想要获得的结果,这涉及某种嵌套的相关子查询处理,这在单个 SPARQL 查询中是不直接可行的(至少在我看来,但如果可能的话,我'我完全在 ;) ):

由于 SPARQL 查询评估的自下而上性质,子查询 首先进行逻辑评估,然后将结果投影到 外部查询。

在与子查询进行连接评估之后应用的第二个限制子句,它只会限制外部查询的结果数。

在第二次尝试的子查询中使用 LIMIT k (k=5) 子句将有效地返回您需要的 5 位艺术家,但随后将 n 限制为 50 只会将专辑结果(外部查询)强制为全局 50 个结果这 5 位艺术家,而不是您想要的 50/艺术家。将查询从里到外翻转会给您类似的效果。

编辑: 一个可能的解决方案是为所有艺术家/专辑构建一个子查询,并将子查询限制在(不知何故)有序专辑计数低于 50 的位置(此处使用专辑 title IRI 排序)

PREFIX dbpedia-owl:<http://dbpedia.org/ontology/>
PREFIX prop:<http://dbpedia.org/property/>
SELECT ?artist ?outputAlbum
WHERE 
{
    {
        SELECT ?artist (MAX(str(?album1)) as ?maxedAlbum)
        WHERE {
            ?album1 prop:artist ?artist .
            ?album2 prop:artist ?artist .
            FILTER (str(?album2) < str(?album1))
        } 
        GROUP BY ?artist 
        HAVING count(?album2)<= 50
        LIMIT 5
    } 
    ?outputAlbum prop:artist ?artist .
    FILTER (str(?outputAlbum) < str(?maxedAlbum))
}

编辑 2:最后一个查询将是天真的方法,但似乎在 dbpedia 端点上有一些推断(未知的 re"gime)(如下所示)。更精确的查询需要有更多的过滤器和不同的子句 - 我在输出中添加了不同的和全局计数,以表明在某处仍有一些推断):

PREFIX dbpedia-owl:<http://dbpedia.org/ontology/>
PREFIX prop:<http://dbpedia.org/property/>
SELECT ?artist ?outputAlbum ?maxedCount ?inferredCrossJoinCount
WHERE 
{
    {
        SELECT ?artist (MAX(str(?album1)) as ?maxedAlbum) (count(distinct ?album2) as ?maxedCount) (count(?album2) as ?inferredCrossJoinCount)
        WHERE {
            ?artist rdf:type dbpedia-owl:Artist .
            ?album1 ?p ?artist .
            ?album2 ?p ?artist .
            FILTER (sameTerm(?p, prop:artist))
            FILTER (str(?album1) < str(?album2))
        } 
        GROUP BY ?artist 
        #HAVING count(?album2)<= 50
        LIMIT 5
    } 
    ?outputAlbum ?p ?artist .
    FILTER (sameTerm(?p, prop:artist))
    FILTER (str(?outputAlbum) < str(?maxedAlbum))
}

【讨论】:

  • 谢谢。现在,在您的帮助下,我可以理解Bottom-up nature。因此,与上述 MQL 相比,没有等效的 SPARQL 查询。对? SPARQL 非常强大,但对我来说很难 ;-)
  • 我可能已经在答案中提供了一个解决方案(虽然它很尴尬,但完全由你来检查)。不确定它如何与 freebase 一起使用,但这将是基于当前 SPARQL 建议的精神。
  • 感谢您抽出宝贵时间。根据Q&A 看来,使用 SPARQL 似乎非常困难。 Here 你可以在 MQL 上运行并且可以看到它的输出。
  • 不客气。因为我目前正在尝试找到一种方法来评估嵌套的相关子查询,同时解决 SPARQL 警告......因此,如果有人有一个更优雅的解决方案,我完全感兴趣;)
  • 我已经编辑了我的问题。有实际的端点和样本查询。只需获取 URI 就可以了,而不是名称(这使查询变得简单)。如果您能帮助我,我将不胜感激。但如果不是那也没关系。这是我的工作 ;-)。谢谢!
猜你喜欢
  • 1970-01-01
  • 2014-02-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多