wikidata 0.0.1 → 0.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/README.md +1 -1
- data/lib/wikidata/command_line.rb +18 -0
- data/lib/wikidata/entity.rb +59 -10
- data/lib/wikidata/identity_map.rb +9 -7
- data/lib/wikidata/item.rb +22 -0
- data/lib/wikidata/version.rb +1 -1
- data/wikidata.gemspec +1 -0
- metadata +16 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: c9c2ff62426ddfda2857a629064bd3e95d269867
|
4
|
+
data.tar.gz: ecd1e1e45425d0f25d6dc125745e688391ac58c6
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ae4db34040575940a822caeb1155a4e1d4dd857ff2cb66579b92045a37709f7ab8bdad98ab6f2d4c7e3598195ef990a64d721f95640b7037ee73631883cb35a0
|
7
|
+
data.tar.gz: 2001dc68293fdd54b86106a397bc07f65ba92a3bf0f4a8493cb9bc5bc95b51730ebb922c0380633413101febd3c75a65473688f4499a1e34a16daa32e2128392
|
data/README.md
CHANGED
@@ -17,6 +17,23 @@ module Wikidata
|
|
17
17
|
display_item Wikidata::Item.find_by_id(article_id)
|
18
18
|
end
|
19
19
|
|
20
|
+
desc "traverse ARTICLE_NAME relation_name", "find all related items until there are no more"
|
21
|
+
def traverse(article_name, relation_name)
|
22
|
+
item = Wikidata::Item.find_by_title(article_name)
|
23
|
+
if item
|
24
|
+
puts "#{item.label.green} (#{item.id})"
|
25
|
+
while true
|
26
|
+
if collection = item.entities_for_property_id(relation_name)
|
27
|
+
if item = collection.first
|
28
|
+
puts "#{item.label.green} (#{item.id})"
|
29
|
+
else
|
30
|
+
break
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
|
20
37
|
protected
|
21
38
|
|
22
39
|
def display_item(item)
|
@@ -27,6 +44,7 @@ module Wikidata
|
|
27
44
|
puts " Claims: #{item.claims.length}" if item.claims
|
28
45
|
if item.claims.length > 0
|
29
46
|
if options[:resolve_properties]
|
47
|
+
item.resolve_claims!
|
30
48
|
table_data = item.claims.map do |claim|
|
31
49
|
{ :id => claim.mainsnak.property_id,
|
32
50
|
'Property Label' => claim.mainsnak.property.label,
|
data/lib/wikidata/entity.rb
CHANGED
@@ -1,19 +1,68 @@
|
|
1
|
+
require "active_support/core_ext/array"
|
2
|
+
|
1
3
|
module Wikidata
|
2
4
|
class Entity < Wikidata::HashedObject
|
3
5
|
|
4
6
|
def self.find_all query
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
7
|
+
|
8
|
+
found_objects = []
|
9
|
+
|
10
|
+
query = {
|
11
|
+
action: 'wbgetentities',
|
12
|
+
sites: 'enwiki',
|
13
|
+
format: 'json'
|
14
|
+
}.merge(Wikidata.default_languages_hash).merge(query)
|
15
|
+
|
16
|
+
ids = query[:ids] || []
|
17
|
+
titles = query[:titles] || []
|
18
|
+
|
19
|
+
# Split IDs and titles
|
20
|
+
ids = ids.split("|") if ids && ids.class == String
|
21
|
+
titles = titles.split("|") if titles && titles.class == String
|
22
|
+
|
23
|
+
# Reject already cached values
|
24
|
+
fetchable_ids = ids.reject do |id|
|
25
|
+
if val = IdentityMap.cached_value(id)
|
26
|
+
found_objects << val
|
27
|
+
true
|
28
|
+
else
|
29
|
+
false
|
30
|
+
end
|
31
|
+
end
|
32
|
+
fetchable_titles = titles.reject do |title|
|
33
|
+
if val = IdentityMap.cached_value(title)
|
34
|
+
found_objects << val
|
35
|
+
true
|
36
|
+
else
|
37
|
+
false
|
38
|
+
end
|
39
|
+
end
|
40
|
+
|
41
|
+
# Fetch by IDs
|
42
|
+
if fetchable_ids.length > 0
|
43
|
+
fetchable_ids.in_groups_of(50, false) do |group|
|
44
|
+
found_objects.concat query_and_build_objects(query.merge(ids: group.join("|")))
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Fetch by titles
|
49
|
+
if fetchable_titles.length > 0
|
50
|
+
fetchable_titles.in_groups_of(50, false) do |group|
|
51
|
+
found_objects.concat query_and_build_objects(query.merge(titles: group.join("|")))
|
15
52
|
end
|
16
53
|
end
|
54
|
+
|
55
|
+
found_objects
|
56
|
+
end
|
57
|
+
|
58
|
+
def self.query_and_build_objects(query)
|
59
|
+
response = HTTParty.get('http://www.wikidata.org/w/api.php', {query: query})
|
60
|
+
# puts "Getting: #{query}"
|
61
|
+
response['entities'].map do |entity_id, entity_hash|
|
62
|
+
item = new(entity_hash)
|
63
|
+
IdentityMap.cache!(entity_id, item)
|
64
|
+
item
|
65
|
+
end
|
17
66
|
end
|
18
67
|
|
19
68
|
def self.find_all_by_id id, query = {}
|
@@ -1,17 +1,19 @@
|
|
1
1
|
module Wikidata
|
2
2
|
class IdentityMap < Wikidata::HashedObject
|
3
3
|
|
4
|
-
def self.
|
5
|
-
|
6
|
-
|
7
|
-
return cached_value
|
4
|
+
def self.if_uncached(key, &block)
|
5
|
+
if cached = cached_value(key)
|
6
|
+
return cached
|
8
7
|
else
|
9
|
-
|
10
|
-
cache! key, content
|
11
|
-
return content
|
8
|
+
block.call
|
12
9
|
end
|
13
10
|
end
|
14
11
|
|
12
|
+
def self.cached_value(key)
|
13
|
+
@@identity_map ||= {}
|
14
|
+
@@identity_map[key]
|
15
|
+
end
|
16
|
+
|
15
17
|
def self.cache!(key, value)
|
16
18
|
@@identity_map ||= {}
|
17
19
|
@@identity_map[key] = value
|
data/lib/wikidata/item.rb
CHANGED
@@ -15,9 +15,31 @@ module Wikidata
|
|
15
15
|
end
|
16
16
|
end
|
17
17
|
|
18
|
+
def resolve_claims!
|
19
|
+
ids = []
|
20
|
+
claims.each do |claim|
|
21
|
+
ids << claim.mainsnak.property_id
|
22
|
+
ids << claim.mainsnak.value.item_id if claim.mainsnak.value.class == Wikidata::DataValues::Entity
|
23
|
+
end
|
24
|
+
self.class.find_all_by_id ids
|
25
|
+
end
|
26
|
+
|
18
27
|
def claims_for_property_id(property_id)
|
19
28
|
claims.select{|c| c.mainsnak.property_id == property_id }
|
20
29
|
end
|
21
30
|
|
31
|
+
def entities_for_property_id(property_id)
|
32
|
+
presets = {
|
33
|
+
mother: "P25",
|
34
|
+
father: "P22",
|
35
|
+
children: "P40",
|
36
|
+
doctoral_advisor: "P184"
|
37
|
+
}
|
38
|
+
property_id = presets[property_id.to_sym] if presets.include?(property_id.to_sym)
|
39
|
+
claims_for_property_id(property_id).map{|c| c.mainsnak.value.entity }
|
40
|
+
rescue
|
41
|
+
[]
|
42
|
+
end
|
43
|
+
|
22
44
|
end
|
23
45
|
end
|
data/lib/wikidata/version.rb
CHANGED
data/wikidata.gemspec
CHANGED
@@ -20,6 +20,7 @@ Gem::Specification.new do |spec|
|
|
20
20
|
spec.add_dependency "httparty"
|
21
21
|
spec.add_dependency "colorize"
|
22
22
|
spec.add_dependency "formatador"
|
23
|
+
spec.add_dependency "activesupport"
|
23
24
|
spec.add_dependency "thor"
|
24
25
|
spec.add_dependency "i18n"
|
25
26
|
spec.add_dependency "hashie", ">= 2.0"
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wikidata
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.0.
|
4
|
+
version: 0.0.2
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Wil Gieseler
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2014-01-
|
11
|
+
date: 2014-01-22 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: httparty
|
@@ -52,6 +52,20 @@ dependencies:
|
|
52
52
|
- - '>='
|
53
53
|
- !ruby/object:Gem::Version
|
54
54
|
version: '0'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: activesupport
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - '>='
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '0'
|
62
|
+
type: :runtime
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - '>='
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '0'
|
55
69
|
- !ruby/object:Gem::Dependency
|
56
70
|
name: thor
|
57
71
|
requirement: !ruby/object:Gem::Requirement
|