似乎没有一致的方法来查询基于名称的编程语言。例子:
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)”,然后回到名称+“(编程语言”)来破解它。 ,如果没有找到结果,请输入名称+“编程语言”。但我想要一个更强大的方法。
答案 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"))
或根本不检查。