wikidata 0.0.1 → 0.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|