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

Sparql 如何按名称一致地查询dbpedia中的编程语言?,sparql,dbpedia,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 由于没有标准约定“pro

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

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

由于没有标准约定“programming language”、“programming language”、“programming_language”、“programming_language”或“programming_language”是否是dbpedia中编程语言名称的一部分,因此我不知道如何按名称进行一致的搜索

我想为“d”和“C++”创建某种类型的SPARQL查询,该查询返回1),但我不知道该怎么做


除非编程语言的各种三元组中至少有一个使用一致的命名约定,否则我必须首先对name+(编程语言)进行查询,然后返回name+(编程语言),name+“编程语言”当找不到结果时。但我想要一个更健壮的方法。

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


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

SPARQL中的正则表达式匹配是出了名的昂贵(就计算时间而言),但是由于您将它与特定类别的类型约束结合起来,DBPedia端点应该能够很好地处理此类查询。

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")
}
<代码>标签BIF:包含“C++”< /COD>会在一定程度上过滤,更具体地说,C++,C,Objul-C等,因为++被当作一个噪声,并且被排除在实际的搜索模式之外。 在这之后,您就有了C并且需要两个加号,因此
过滤器(str(?label)比如'%C++%')
将比正则表达式更快地检查它们。
添加<代码>过滤器(郎((标签)=“EN”)<代码> >或代码>过滤器(LangSuffice(郎(?标签),EN”)<或代码>或根本没有按味道检查。< /P>可能没有一个,它看起来是草图,尝试使用这个名称作为某种形式的标记/语义标记。C++已经“完善”了而D(编程语言)是相对较新的。出于某种重大原因,它还选择了一个非常常见的“名称”。例如,处理Ruby时会发生什么?也就是说,为什么不使用本体/属性来代替?例如@pst重要的是,我想制作一个给定编程语言名称的程序,如“Python”或“QML”,显示其与其他编程语言的关系的可视化图形。programming_language类别将确保我的查询结果都是正确的类型,但这无助于我按名称查找语言资源。“您可能需要进行一些巧妙的后处理”和“SPARQL中的正则表达式匹配是出了名的昂贵”表示这不是一个完整格式的解决方案。您可以请求DBPedia维护人员对此进行预处理,在标签中剪掉(或添加)常见的前缀或后缀,以便它们在DBPedia数据库中更为规则,但在此之前,您只能使用正则表达式和巧妙的后处理(这将非常有效),或其他方法(例如,用户的下拉列表,而不是关键字搜索字段)。
SELECT DISTINCT ?pl ?label
WHERE { 
    ?pl a dbpedia-owl:ProgrammingLanguage ;
        rdfs:label ?label .
    FILTER(langMatches(lang(?label), "en"))
    FILTER(regex(str(?label), "C\\+\\+")) 
}
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")
}