Sparql查找dbo类型的实体,然后按计数对它们进行排序

时间:2019-03-11 21:07:01

标签: sparql dbpedia

我必须对dbpedia端点进行sparql查询,这需要:

  1. label中查找包含“维也纳”的所有实体,在abstract中查找包含“城市”的所有实体
  2. 过滤掉它们,只保留至少一个dbo rdf:type
  3. dbo类型的数量对结果进行排序(例如,如果一个实体有5个dbo rdf:type,则必须在具有4个dbo {{1}的实体之前显示})

我做了几次尝试,最接近结果的是:

rdf:type

在实际过滤select distinct (str(?s) as ?s) count(?t) as ?total where {{ ?s rdfs:label "vienna"@en. ?s rdf:type ?t.} UNION { ?s rdfs:label ?l. ?s rdf:type ?t . ?l <bif:contains> '("vienna")' . FILTER EXISTS { ?s dbo:abstract ?cc. ?cc <bif:contains> '("city")'. FILTER(lang(?cc) = "en").}} FILTER (!strstarts(str(?s), str("http://dbpedia.org/resource/Category:"))) . FILTER (!strstarts(str(?s), str("http://dbpedia.org/property/"))) . FILTER (!strstarts(str(?s), str("http://dbpedia.org/ontology/"))) . FILTER (strstarts(str(?t), str("http://dbpedia.org/ontology/"))).} LIMIT 50 之前会(错误地)计数rdf:type。我不想统计不是rdf:type(本体)的dbo

1 个答案:

答案 0 :(得分:1)

想法是使用子查询,在其中搜索实体并在外部查询中进行计数:

PREFIX  dbo:  <http://dbpedia.org/ontology/>
PREFIX  rdf:  <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX  rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT  ?s (count(*) AS ?cnt)
WHERE
  { { SELECT DISTINCT  ?s
      WHERE
        { ?s  rdfs:label      ?l .
          ?l  <bif:contains>  '"vienna"'
          FILTER langMatches(lang(?l), "en")
          FILTER EXISTS { ?s   dbo:abstract    ?cc .
                          ?cc  <bif:contains>  '"city"'
                          FILTER langMatches(lang(?cc), "en")
                        }
          ?s  rdf:type  ?t
          FILTER ( ! strstarts(str(?s), str("http://dbpedia.org/resource/Category:")) )
          FILTER ( ! strstarts(str(?s), str("http://dbpedia.org/property/")) )
          FILTER ( ! strstarts(str(?s), str(dbo:)) )
          FILTER strstarts(str(?t), str(dbo:))
        }
    }
    ?s  ?p  ?o
    FILTER strstarts(str(?p), str(dbo:))
  }
GROUP BY ?s
ORDER BY DESC(?cnt)