14

我正在尝试查询 DBPedia 以获取与本体中给定类相关的属性列表,但由于人类可读的“标签”并不总是清晰的,我还想提供数据库中的示例。问题是,虽然我想选择所有不同的属性,但我只想要每个属性的一个示例。这是我的查询在不捕获示例的情况下的外观:

SELECT DISTINCT ?prop ?title WHERE {
    ?thing ?prop [].
    ?thing a <http://dbpedia.org/ontology/Currency>.
    ?prop rdf:type rdf:Property.
    ?prop rdfs:label ?title.
} ORDER BY DESC(COUNT(DISTINCT ?thing))
LIMIT 100

如果我以这种方式更改它,我开始获得 ?prop 的重复值:

SELECT DISTINCT ?prop ?title ?example WHERE {
    ?thing ?prop ?example.
    ?thing a <http://dbpedia.org/ontology/Currency>.
    ?prop rdf:type rdf:Property.
    ?prop rdfs:label ?title.
} ORDER BY DESC(COUNT(DISTINCT ?thing))
LIMIT 100

一般来说,我对使用 SPARQL 和数据库查询非常陌生,所以我完全不清楚如何做到这一点。理想情况下,我会有类似 DISTINCT(?prop) ?title ?example 的东西,它为 prop 选择每个唯一值,并返回其标题和示例。

4

3 回答 3

10

在您的第二个查询中, distinct 适用于 和 的值的?prop ?title组合?example。因此,您没有得到任何重复项,例如在第二个查询中获得的以下两行:

dbpedia2:subunitName    "subunit name "@en  "cent"@en
dbpedia2:subunitName    "subunit name "@en  "centavo"@en

它们不是重复的,因为第三行?example有两个不同的值"cent"@en,并且"centavo"@en

解决此问题的一种可能方法是使用GROUP BYMIN获得 and 的最低排名值?label?example即:

SELECT ?prop MIN(?title) MIN(?example) WHERE {
    ?thing ?prop ?example.
    ?thing a <http://dbpedia.org/ontology/Currency>.
    ?prop rdf:type rdf:Property.
    ?prop rdfs:label ?title.
} GROUP BY ?prop
于 2011-03-22T21:15:32.453 回答
5

这是使用子查询实现您想要的另一种方法:

SELECT ?prop ?title ?example 
WHERE 
{
    ?thing a <http://dbpedia.org/ontology/Currency>.
    ?prop rdf:type rdf:Property.
    { SELECT ?title ?example WHERE { ?thing ?prop ?example . ?prop rdfs:label ?title. } LIMIT 1 }
}
LIMIT 100

这样做的好处是它符合 SPARQL 1.1 标准,正如我在评论中所说,标准不允许按聚合排序,因此您使用的是供应商特定的扩展,这将限制查询的可移植性。

如果您确实想以可跨 SPARQL 1.1 实现移植的方式按聚合值排序,那么您必须首先像这样进行投影:

SELECT ?s (COUNT(?p) AS ?predicates) WHERE
{
  ?s ?p ?o
} GROUP BY ?s ORDER BY DESC(?predicates)
于 2011-03-23T08:55:33.980 回答
2

如果您不关心示例但关心速度,SAMPLE则可以比GROUP BY

SELECT ?prop (SAMPLE(?title) AS ?title) (SAMPLE(?example) AS ?example) 
WHERE {
    ?thing ?prop ?example.
    ?thing a <http://dbpedia.org/ontology/Currency>.
    ?prop rdf:type rdf:Property.
    ?prop rdfs:label ?title.
} LIMIT 100

您可能不会注意到 dbpedia 上的差异,因为它缓存了查询结果,但我注意到在使用其他端点时存在巨大差异。

我在创建查询多个 sparql 端点的自动完成服务时遇到了同样的问题。我需要找到与搜索词相关的单个链接,其中链接本身不是很重要,但查询的速度重要。

于 2018-11-09T11:03:14.117 回答