语义网查询入门





5.00/5 (4投票s)
本文介绍了如何使用 SPARQL 查询语义网页。
引言
我的五岁儿子喜欢用我的安卓手机进行语音搜索,并听取由可爱的半人半机器的声音讲述的答案。例如,他会问“法国的首都是什么?”,手机会回答“巴黎”,“非洲最大的国家是什么?”“阿尔及利亚”。然而,有一天,当他问“美国和中国哪个更大”却没有得到答案时,他感到非常沮丧!
这种情况显示了当前搜索引擎的局限性,它使用关键词和标签来查找与您的搜索相关的网页。搜索的准确性和质量主要取决于您提出的问题的受欢迎程度。如果其他人之前回答过您的问题(在这种庞大的人群中很有可能),搜索引擎将检索此页面,您就得到了答案;但是,如果您问一个相对复杂的问题,您就运气不好了。在另一种情况下,如果您有一个复合问题(例如,列出美国所有州,以及每个州有多少位总统出生),您可能需要浏览多个网页才能得到答案(同样,如果没有人之前回答过这个问题)。
语义网
这种搜索功能的局限性与网络的结构方式有关。它只是一堆人类可读但机器不可读的文本文件。机器无法从不同的网页收集数据来形成答案。因此,有人建议使用一种新结构,称为语义网,它既可以供人类阅读,更重要的是可以供机器阅读。
有很多精彩的文章详细解释了语义网,但在这里我将更多地关注搜索和查询功能,这是最强大的功能之一。在这个演示中,我将使用两个使用语义网的网站(Dbpedia.org 和 wikidata.org)。这两个网站将巨大的百科全书维基百科转换为 RDF/OWL 格式,这允许机器合并来自不同网页的数据以回答复合问题。这两个网站之间存在一些技术差异,但它们超出了本文的范围。
为了搜索语义网,我们使用一种名为 SPARQL 协议和 RDF 查询语言 (SPARQL) 的查询语言,但奇怪的是,S 递归地引用了 SPARQL。SPARQL 与 SQL 非常相似。为了编写查询,可以使用 SPARQL 端点,这是一个简单的网页,用于编写查询并显示结果(想想 Google 首页),或者使用语义网库编写自定义应用程序。有很多好的语义网库,例如 Jena (Java) 和 dotNetRDF (C#)。在本文中,我将演示端点和 Jena 框架。
SPARQL 端点
这些网站中的每一个都提供了一个 SPARQL 端点来编写查询,让我们转到 https://query.wikidata.org 并编写以下查询以获取所有美国总统及其签名。
SELECT ?president ?president_name ?signature
WHERE {
?president wdt:P39 wd:Q11696.
?president wdt:P109 ?signature.
OPTIONAL {?president rdfs:label ?president_name
filter (lang(?president_name) = "en") .}
}
现在让我们转到另一个端点 http://dbpedia.org/sparql,并使用此查询检索所有加拿大的公立大学及其城市和人口。
SELECT *
WHERE {
?Univeristy dbo:type dbr:Public_university.
?Univeristy dbp:country dbr:Canada.
?Univeristy dbp:city ?city.
?city dbo:populationTotal ?population
} ORDER BY DESC(?population)
Jena
除了使用 SPARQL 端点外,您还可以使用语义网库来编写自定义应用程序。在这里,我将使用 Jena,它是支持语义网技术的最强大的库之一。
可以从其网站 https://jena.apache.org/ 下载 Jena,或者将其添加到您的 Maven pom 文件中。
<dependency>
<groupId>org.apache.jena</groupId>
<artifactId>apache-jena-libs</artifactId>
<version>3.0.1</version>
</dependency>
以下代码使用 dbpedia 网站运行查询,附加示例还演示了 wikidata 和 linkedmdb。
public static void main(String[] args) {
//The query
String queryString =
"PREFIX dbont: <http://dbpedia.org/ontology/> " +
"PREFIX dbp: <http://dbpedia.org/property/>" +
"PREFIX geo: <http://www.w3.org/2003/01/geo/wgs84_pos#>" +
" SELECT ?musician ?place" +
" WHERE { " +
" ?musician dbont:birthPlace ?place ." +
" }";
// Create query object
Query query = QueryFactory.create(queryString);
// Initializing queryExecution factory with remote service.
QueryExecution qexec = QueryExecutionFactory.sparqlService("http://dbpedia.org/sparql", query);
// Run the query and display the results
try {
ResultSet results = qexec.execSelect();
ResultSetFormatter.out(System.out, results, query);
} catch (Exception ex) {
System.out.println(ex.getMessage());
} finally {
qexec.close();
}
}
限制
没有人能挑战语义网相对于当前网络模式的优势。尽管如此,语义网尚未普及,也未达到临界规模以获得足够的动力。这可以归因于对当前模型所需的根本性改变,这通常不受许多思维模式的欢迎;而且,显然,查询的语法必须正确才能运行,而简单的关键词搜索则没有任何要求。
结论
语义网提供了一种新的方法来处理机器“可理解”的数据。尽管与这项新技术相关联存在许多困难,但它将不断发展,并肯定会在未来取代当前的网络结构。
历史
- v 1.0 2016 年 4 月 23 日。