如何按名称一致地查询dbpedia的编程语言?

时间:2012-10-26 21:16:05

标签: sparql dbpedia

似乎没有一致的方法来查询基于名称的编程语言。例子:

http://dbpedia.org/page/D_(programming_language)
rdfs:label "D (programming language)"@en
dbpprop:name "D programming language"
owl:sameAs freebase:"D (programming language)"
foaf:name "D programming language"

VS

http://dbpedia.org/page/C++
rdfs:label "C++"@en
dbpprop:name "C++"
owl:samwAs freebase:"C++"
foaf:name "C++"

由于“编程语言”,“(编程语言)”,“programming_language”,“(programming_language”或“”是否是dbpedia中编程语言名称的一部分,没有标准惯例,我不知道如何按姓名持续搜索。

我想为“D”创建某种返回http://dbpedia.org/page/D_(programming_language)的SPARQL查询,为“C ++”创建http://dbpedia.org/page/C++,但我不知道如何做到这一点。

除非编程语言的各种三元组中至少有一个使用一致的命名约定,否则我将不得不通过首先查询名称+“(programming_language)”,然后回到名称+“(编程语言”)来破解它。 ,如果没有找到结果,请输入名称+“编程语言”。但我想要一个更强大的方法。

2 个答案:

答案 0 :(得分:3)

您当然可以使用基本子字符串匹配或正则表达式进行匹配,例如像这样找到“C ++”的匹配:

SELECT DISTINCT ?pl ?label
WHERE { 
    ?pl a dbpedia-owl:ProgrammingLanguage ;
        rdfs:label ?label .
    FILTER(langMatches(lang(?label), "en"))
    FILTER(regex(str(?label), "C\\+\\+")) 
}

当然,上面的编程语言名称如“D”会有问题,因为你会得到几个匹配(“D”,“Dylan”,“MAD”等)。在这些情况下,您可能希望对结果进行一些巧妙的后处理,例如,标记返回的标签并查看输入字符串是否作为独立单词出现。

SPARQL中的正则表达式匹配非常昂贵(就评估时间而言),但由于您将它与类型约束结合到特定类别,因此DBPedia端点应该能够很好地处理这种查询。

答案 1 :(得分:1)

我用

SELECT distinct ?pl ?label
WHERE { 
  ?pl a dbpedia-owl:ProgrammingLanguage ;
      rdfs:label ?label.
  ?label bif:contains "'C++'" .
  filter (str (?label) like '%C++%')
  filter (lang(?label)="en")
}

?label bif:contains "'C++'"会在某种程度上过滤,更具体地说是过滤C ++,C,Objective-C等,因为++会被视为噪音并被排除在实际搜索模式之外。 之后你有C并需要两个加号,所以filter (str (?label) like '%C++%')会比正则表达式更快地检查它们。 根据品味,添加filter (lang(?label)="en")filter (langmatches(lang(?label),"en"))或根本不检查。