3

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

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"

对比

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

由于“编程语言”、“(编程语言)”、“编程语言”、“(编程语言”或“”是否是 dbpedia 中编程语言名称的一部分没有标准约定,我不知道如何一致按名称搜索。

我想创建某种 SPARQL 查询,为“D”返回http://dbpedia.org/page/D_(programming_language ),为“C++”返回 http://dbpedia.org/page/C++,但不知道该怎么做。

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

4

2 回答 2

4

您当然可以使用基本的子字符串匹配或正则表达式进行匹配,例如像这样查找“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 端点应该能够很好地处理这种查询。

于 2012-10-26T23:35:59.720 回答
0

我会用

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"))任何语言检查。

于 2012-10-29T04:04:00.233 回答