代码改变世界

Javascript查询DBpedia小应用

2013-03-07 12:01  Justany_WhiteSnow  阅读(3118)  评论(0编辑  收藏  举报

上一篇文章中,我们了解了SPARQL、SPARQL Endpoint,并简单做了一个SPARQLWrapper.js,来从DBpedia中查询了一些数据。

本文则尝试利用SPARQLWrapper.js来读取DBpedia的数据,并显示出来。

 

目标

通过输入一个英文单词,然后返回WIKI中相关的信息。

那么主要要解决的问题就是怎样的SPARQL语句能够查询到我们需要的东西。

 

先看一段简单的SPARQL查询语句

PREFIX : <http://aabs.purl.org/music#>
SELECT ?instrument
WHERE {
 :andrew :playsInstrument ?instrument .
}

首先定义一个域名空间http://aabs.purl.org/music#。

然后选择这样子的instrument变量,他满足:

主语是http://aabs.purl.org/music#andrew,谓语是http://aabs.purl.org/music#playsInstrument,宾语是该instrument。

 

bif:contains()

bif:contains()是contains()函数的变种函数,顾名思义是判断是否包含的函数。

利用这个我们能查询到我们需要的数据了。

prefix foaf: <http://xmlns.com/foaf/0.1/> 
select distinct ?url ?alma ?comment 
where { 
?s foaf:name ?sname . 
?sname bif:contains 'China'. 
?s foaf:depiction ?url . 
?s dbpedia-owl:wikiPageExternalLink ?alma . 
?s rdfs:comment ?comment . 
} 
limit 10

这段SPARQL语句是查询包含China的名字的词条,然后将其图片的url、homepage的url,以及简介返回回来。

下面让我们把整个程序写完。

 

完整代码

<html>
<head>
    <meta charset="utf-8">
    <title>SPARQL DEMO</title>
    <script src="SPARQLWrapper.js"></script>
    <script>
    
    var $ = function(id){
            return document.getElementById(id);
        },
        sparql = new SPARQLWrapper("http://dbpedia.org/sparql"),
        results = [];
    
    function getInfo(name){
        name = name.replace(/\s/g, "_");
        var command = "prefix foaf: <http://xmlns.com/foaf/0.1/> "
                        + "select distinct ?url ?alma ?comment "
                        + "where { "
                        + "?s foaf:name ?sname . "
                        + "?sname bif:contains '" + name + "'. "
                        + "?s foaf:depiction ?url . "
                        + "?s dbpedia-owl:wikiPageExternalLink ?alma . "
                        + "?s rdfs:comment ?comment . "
                        + "} "
                        + "limit 10";
            sparql.setQuery(command);
            sparql.query(function(json){
                showInfo((eval("(" + json + ")")).results.bindings);
            });
    }
    
    function showInfo(results){
        var text = "";
        if(results.length !== 0){
            for(var i = 0; i < results.length; i++){
                text += "<img src = '" + results[i].url.value + "' /><br />";
                text += "homepage:" + "<a href = '" + results[i].alma.value + "' >" + results[i].alma.value + "</a><br />";
                text += "<p>" + results[i].comment.value + "</p><br /><br /><br />";
                $("result").innerHTML = text;
            }
        }else{
            $("result").innerHTML = "没有任何相关信息!";
        }
        
    }
                    
    </script>
</head>
<body>
<p>目前只支持英文查询。</p>
<input type="text" id="name"/>
<input type="button" onclick="getInfo(document.getElementById('name').value);" value="Wiki Search" />
<div id="result"></p>


</body>
</html>

 

遗留问题

不太清楚中文怎么查询,如有知道的朋友,麻烦告知一下,谢谢。

 

例子

http://pan.baidu.com/share/link?shareid=293219&uk=855675565