dbpedia 0.0.1
Sign up to get free protection for your applications and to get access to all the features.
- data/README.md +67 -0
- data/config/dbpedia.yml +9 -0
- data/lib/dbpedia.rb +40 -0
- data/lib/dbpedia/client.rb +43 -0
- data/lib/dbpedia/exception.rb +22 -0
- data/lib/dbpedia/parser.rb +35 -0
- data/lib/dbpedia/request.rb +22 -0
- data/lib/dbpedia/request/params.rb +20 -0
- data/lib/dbpedia/result.rb +5 -0
- data/lib/dbpedia/search_result.rb +21 -0
- data/lib/dbpedia/search_result/category.rb +16 -0
- data/lib/dbpedia/search_result/klass.rb +16 -0
- metadata +74 -0
data/README.md
ADDED
@@ -0,0 +1,67 @@
|
|
1
|
+
# DBpedia Client for Ruby
|
2
|
+
|
3
|
+
## Features
|
4
|
+
|
5
|
+
* Search for Dbpedia entries by *keyword* or *prefix* (e.g. autocompleter)
|
6
|
+
* Use SPARQL via [Ruby RDFs great *sparql-client*](https://github.com/ruby-rdf/sparql-client) to query Dbpedia
|
7
|
+
|
8
|
+
## Installation
|
9
|
+
|
10
|
+
Simply add it to your Gemfile:
|
11
|
+
|
12
|
+
gem "dbpedia"
|
13
|
+
gem "sparql-client" # if you want to use sparql
|
14
|
+
|
15
|
+
## Examples
|
16
|
+
|
17
|
+
### Search by *keyword* and *prefix* (notice their different results)
|
18
|
+
|
19
|
+
# Default search is by keyword:
|
20
|
+
Dbpedia.search('Ham').collect(&:label)
|
21
|
+
Dbpedia.search('Ham', method: 'keyword').collect(&:label)
|
22
|
+
#=> ["West Ham United F.C.", "Ham", "West Ham", "East Ham", "Hamarkameratene"]
|
23
|
+
|
24
|
+
# To perform a prefix-search (which is usefull for autocompleter) pass `method`:
|
25
|
+
Dbpedia.search('Ham', method: 'prefix').collect(&:label)
|
26
|
+
#=> ["Hamburg", "Hampshire", "Hamlet (place)", "Hamlet", "Hamilton, Ontario"]
|
27
|
+
|
28
|
+
### Fetch search details
|
29
|
+
|
30
|
+
results = Dbpedia.search('Hamburg')
|
31
|
+
puts results.first.label #=> "Hamburg"
|
32
|
+
puts results.first.categories.count #=> 15
|
33
|
+
puts results.first.categories.first.label #=> Populated places established in the 9th century"
|
34
|
+
|
35
|
+
#### Possible methods
|
36
|
+
|
37
|
+
[results] (SearchResult)
|
38
|
+
|-- label
|
39
|
+
|-- uri
|
40
|
+
|-- description
|
41
|
+
+-- [categories] (SearchResult::Category)
|
42
|
+
| |-- label
|
43
|
+
| |-- uri
|
44
|
+
+-- [classes] (SearchResult::Klass)
|
45
|
+
|-- label
|
46
|
+
|-- uri
|
47
|
+
|
48
|
+
### SPARQL Queries
|
49
|
+
|
50
|
+
Marke sure you've installed [*sparql-client*](https://github.com/ruby-rdf/sparql-client)!
|
51
|
+
|
52
|
+
Dbpedia.sparql.select.whatever
|
53
|
+
|
54
|
+
## Milestones
|
55
|
+
|
56
|
+
* Implement `find` for known resources
|
57
|
+
* Gemify
|
58
|
+
|
59
|
+
## Specs
|
60
|
+
|
61
|
+
Run `$ bundle exec rspec -c`
|
62
|
+
|
63
|
+
## Gloss
|
64
|
+
|
65
|
+
Copyright © 2013 [Roman Ernst](http://wanderwort.de), released under [CC BY-SA 3.0](http://creativecommons.org/licenses/by-sa/3.0/) license
|
66
|
+
|
67
|
+
.. without warranty of any kind!
|
data/config/dbpedia.yml
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
dbpedia:
|
2
|
+
uris:
|
3
|
+
search:
|
4
|
+
keyword: 'http://lookup.dbpedia.org/api/search.asmx/KeywordSearch'
|
5
|
+
prefix: 'http://lookup.dbpedia.org/api/search.asmx/PrefixSearch'
|
6
|
+
sparql: 'http://dbpedia.org/sparql'
|
7
|
+
params:
|
8
|
+
query_class: QueryClass
|
9
|
+
query_string: QueryString
|
data/lib/dbpedia.rb
ADDED
@@ -0,0 +1,40 @@
|
|
1
|
+
require 'yaml'
|
2
|
+
|
3
|
+
module Dbpedia
|
4
|
+
|
5
|
+
File.open(File.expand_path('../../config/dbpedia.yml', __FILE__)) do |file|
|
6
|
+
Dbpedia::Config = YAML::load(file)['dbpedia']
|
7
|
+
end
|
8
|
+
|
9
|
+
require 'dbpedia/exception'
|
10
|
+
require 'dbpedia/request'
|
11
|
+
require 'dbpedia/client'
|
12
|
+
require 'dbpedia/result'
|
13
|
+
require 'dbpedia/search_result'
|
14
|
+
|
15
|
+
###
|
16
|
+
# Returns a Dbpedia::Result object for _name_
|
17
|
+
def self.find(name, *args)
|
18
|
+
client.find(name, *args)
|
19
|
+
end
|
20
|
+
|
21
|
+
###
|
22
|
+
# Returns an array of matching strings for _query_
|
23
|
+
def self.search(query, *args)
|
24
|
+
client.search(query, *args)
|
25
|
+
end
|
26
|
+
|
27
|
+
###
|
28
|
+
# Access to sparql delegator
|
29
|
+
def self.sparql
|
30
|
+
client.sparql
|
31
|
+
end
|
32
|
+
|
33
|
+
private
|
34
|
+
|
35
|
+
###
|
36
|
+
# Initialize a new Dbpedia::Client
|
37
|
+
def self.client
|
38
|
+
@client ||= Dbpedia::Client.new
|
39
|
+
end
|
40
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
module Dbpedia
|
2
|
+
class Client
|
3
|
+
|
4
|
+
def initialize
|
5
|
+
@uris = Dbpedia::Config['uris']
|
6
|
+
end
|
7
|
+
|
8
|
+
def find(query, opts={})
|
9
|
+
|
10
|
+
end
|
11
|
+
|
12
|
+
###
|
13
|
+
# Possible keys for _opts_:
|
14
|
+
# * *search_method*: Either *keyword_search* (default) or *prefix_search*
|
15
|
+
# * *query_class*: A DBpedia class that defines a search scope
|
16
|
+
def search(query, opts={})
|
17
|
+
search_method = (opts[:method] || :keyword).to_s
|
18
|
+
result = request @uris['search'][search_method] do |params|
|
19
|
+
params.query_class = opts[:query_class] if opts.has_key?(:query_class)
|
20
|
+
params.query_string = query
|
21
|
+
end
|
22
|
+
Dbpedia::SearchResult.load_many_from(result)
|
23
|
+
end
|
24
|
+
|
25
|
+
###
|
26
|
+
# Delegate sparql calls to `sparql-client` gem if available
|
27
|
+
def sparql
|
28
|
+
return @sparql if @sparql
|
29
|
+
begin
|
30
|
+
require 'sparql/client'
|
31
|
+
rescue LoadError
|
32
|
+
raise Exception::SparqlLoadError
|
33
|
+
end
|
34
|
+
@sparql = SPARQL::Client.new(@uris['sparql'])
|
35
|
+
end
|
36
|
+
|
37
|
+
private
|
38
|
+
|
39
|
+
def request(uri, &block)
|
40
|
+
Dbpedia::Request.new(uri, &block)
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Dbpedia
|
2
|
+
module Exception
|
3
|
+
|
4
|
+
class SparqlLoadError < StandardError
|
5
|
+
def message
|
6
|
+
"""
|
7
|
+
You need to to install `sparql-client` in order to use `sparql`.
|
8
|
+
In your Gemfile: `gem \"sparql-client\"` and run `$ bundle install`.
|
9
|
+
"""
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
class NoParserMethod < StandardError
|
14
|
+
def message
|
15
|
+
"""
|
16
|
+
You should add a `parse` method to each Dbpedia::Parser class.
|
17
|
+
"""
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
module Dbpedia
|
2
|
+
class Parser
|
3
|
+
require 'nokogiri'
|
4
|
+
attr_reader :doc
|
5
|
+
|
6
|
+
###
|
7
|
+
# Create a new SearchResult object for each result
|
8
|
+
def self.load_many_from(doc, selector='Result')
|
9
|
+
return [] if doc.empty?
|
10
|
+
doc = Nokogiri::XML(doc.body) unless doc.is_a? Nokogiri::XML::NodeSet
|
11
|
+
doc.css(selector).map do |result|
|
12
|
+
self.new(result).parse
|
13
|
+
end
|
14
|
+
end
|
15
|
+
|
16
|
+
def initialize(doc)
|
17
|
+
@doc = doc
|
18
|
+
end
|
19
|
+
|
20
|
+
def read_xml(attr)
|
21
|
+
@doc.css(attr)
|
22
|
+
end
|
23
|
+
|
24
|
+
def read(attr)
|
25
|
+
read_xml(attr).inner_text
|
26
|
+
end
|
27
|
+
|
28
|
+
##
|
29
|
+
# Each SearchResult object shall
|
30
|
+
# define it's own parsing method
|
31
|
+
def parse
|
32
|
+
raise Exception::NoParserMethod
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
require 'dbpedia/request/params'
|
2
|
+
|
3
|
+
module Dbpedia
|
4
|
+
class Request
|
5
|
+
require 'uri'
|
6
|
+
require 'open-uri'
|
7
|
+
|
8
|
+
attr_accessor :params, :uri, :body
|
9
|
+
|
10
|
+
def initialize(uri)
|
11
|
+
@params = Params.new and (yield(@params, uri) if block_given?)
|
12
|
+
@uri = URI.parse(uri)
|
13
|
+
@uri.query = URI.encode_www_form(@params.active)
|
14
|
+
@uri.tap { |uri| @body = uri.open.read }
|
15
|
+
end
|
16
|
+
|
17
|
+
def empty?
|
18
|
+
body.empty?
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
module Dbpedia
|
2
|
+
class Request
|
3
|
+
class Params
|
4
|
+
###
|
5
|
+
# Read available params from config
|
6
|
+
# Initialize param setter methods
|
7
|
+
Dbpedia::Config['params'].each do |method_name, param_name|
|
8
|
+
define_method "#{method_name}=" do |value|
|
9
|
+
@active[param_name] = value
|
10
|
+
end
|
11
|
+
end
|
12
|
+
|
13
|
+
attr_accessor :active
|
14
|
+
|
15
|
+
def initialize
|
16
|
+
@active = {}
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,21 @@
|
|
1
|
+
require 'dbpedia/parser'
|
2
|
+
|
3
|
+
module Dbpedia
|
4
|
+
class SearchResult < Dbpedia::Parser
|
5
|
+
require 'dbpedia/search_result/category'
|
6
|
+
require 'dbpedia/search_result/klass'
|
7
|
+
|
8
|
+
attr_accessor :label, :uri, :description, :label, :categories, :classes
|
9
|
+
|
10
|
+
def parse
|
11
|
+
self.tap do |obj|
|
12
|
+
obj.label = read '> Label'
|
13
|
+
obj.uri = read '> URI'
|
14
|
+
obj.description = read '> Description'
|
15
|
+
obj.categories = Category.load_many_from(read_xml('> Categories'), 'Category')
|
16
|
+
obj.classes = Klass.load_many_from(read_xml('> Classes'), 'Class')
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
metadata
ADDED
@@ -0,0 +1,74 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: dbpedia
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.0.1
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Roman Ernst
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2013-03-15 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: nokogiri
|
16
|
+
requirement: !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: 1.5.5
|
22
|
+
type: :runtime
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: !ruby/object:Gem::Requirement
|
25
|
+
none: false
|
26
|
+
requirements:
|
27
|
+
- - ! '>='
|
28
|
+
- !ruby/object:Gem::Version
|
29
|
+
version: 1.5.5
|
30
|
+
description: Simple search for DBpedia resources. Optional support for sparql.
|
31
|
+
email: rernst@farbenmeer.bet
|
32
|
+
executables: []
|
33
|
+
extensions: []
|
34
|
+
extra_rdoc_files: []
|
35
|
+
files:
|
36
|
+
- README.md
|
37
|
+
- lib/dbpedia/client.rb
|
38
|
+
- lib/dbpedia/exception.rb
|
39
|
+
- lib/dbpedia/parser.rb
|
40
|
+
- lib/dbpedia/request/params.rb
|
41
|
+
- lib/dbpedia/request.rb
|
42
|
+
- lib/dbpedia/result.rb
|
43
|
+
- lib/dbpedia/search_result/category.rb
|
44
|
+
- lib/dbpedia/search_result/klass.rb
|
45
|
+
- lib/dbpedia/search_result.rb
|
46
|
+
- lib/dbpedia.rb
|
47
|
+
- config/dbpedia.yml
|
48
|
+
homepage: https://github.com/farbenmeer/dbpedia
|
49
|
+
licenses:
|
50
|
+
- CC BY-SA 3.0
|
51
|
+
post_install_message:
|
52
|
+
rdoc_options: []
|
53
|
+
require_paths:
|
54
|
+
- lib
|
55
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
56
|
+
none: false
|
57
|
+
requirements:
|
58
|
+
- - ! '>='
|
59
|
+
- !ruby/object:Gem::Version
|
60
|
+
version: 1.9.2
|
61
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
62
|
+
none: false
|
63
|
+
requirements:
|
64
|
+
- - ! '>='
|
65
|
+
- !ruby/object:Gem::Version
|
66
|
+
version: '0'
|
67
|
+
requirements: []
|
68
|
+
rubyforge_project:
|
69
|
+
rubygems_version: 1.8.23
|
70
|
+
signing_key:
|
71
|
+
specification_version: 3
|
72
|
+
summary: DBpedia Client for Ruby
|
73
|
+
test_files: []
|
74
|
+
has_rdoc:
|