【问题标题】:How do I consistently query dbpedia for programming languages by name?如何始终按名称查询 dbpedia 以获取编程语言?
【发布时间】:2012-10-17 04:02:21
【问题描述】:

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

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 + "programming language" 当没有找到结果时。但我想要一个更健壮的方法。

【问题讨论】:

  • 也许没有?似乎草图尝试将名称用作某种形式的标签/语义标记。 C++ 已经“完善”,而 D(编程语言)相对较新。出于某种重大原因,它还选择了一个非常常见的“名称”。例如。与 Ruby 打交道会发生什么?
  • 也就是说,为什么不使用本体/属性来代替呢?例如dbpedia.org/page/Category:Programming_languages
  • @pst 大局是我想制作一个程序,给定一个编程语言名称,例如“Python”或“QML”,显示它与其他编程语言关系的可视化图表. Programming_language 类别将确保我的查询结果都是正确的类型,但这并不能帮助我按名称查找语言资源。

标签: sparql dbpedia


【解决方案1】:

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

【讨论】:

  • “你可能想做一些聪明的后处理”和“SPARQL 中的正则表达式匹配是出了名的昂贵”表明这不是一个完整的解决方案。
  • 您也许可以请求 DBPedia 维护人员对其进行预处理,剪掉(或添加)标签中常见的前缀或后缀,以便它们在 DBpedia 数据库中更常规,但在此之前您是坚持使用正则表达式和巧妙的后处理(这将足够好),或替代方法(例如,为您的用户提供下拉列表,而不是关键字搜索字段)。
【解决方案2】:

我会使用

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")) 或根据口味根本不检查语言。

【讨论】:

    猜你喜欢
    • 2021-01-13
    • 1970-01-01
    • 2011-10-08
    • 2016-12-04
    • 1970-01-01
    • 2011-06-24
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    相关资源
    最近更新 更多