examples/streets.rb in active-orient-0.4 vs examples/streets.rb in active-orient-0.5
- old
+ new
@@ -1,9 +1,8 @@
=begin
Streets Example
-
We load german cities from wikipedia and parse the document for cities and countries(states).
Further we load a collection of popular streetnames from a web-side called »strassen-in-deutschland«
We define three vertices, State, City and Street.
These are filled with the data from the web-sides
@@ -13,117 +12,119 @@
=end
module DataImport
def read_german_street_names
doc = Nokogiri::HTML(open('http://www.strassen-in-deutschland.de/die-haeufigsten-strassennamen-in-deutschland.html'))
- strassen = doc.css('#strassen-in-deutschland_main a' ) # identified via css-inspector in browser
+ strassen = doc.css("td[data-header='Straßenname: '] a") # identified via css-inspector in browser
# search for the css and include only links, then display the text-part
strassen.children.map( &:to_s )[3..-1] # omit the first three (strassen in deutschland, straßenverzeichnis, straßen)
end
- def read_german_cities_from_wikipedia
- # we extract <li> -elements and use the text until "("
+ def read_german_cities_from_wikipedia
+ # we extract <li> -elements and use the text until "("
#doc.xpath("//li").at(80)
- # => #<Nokogiri::XML::Element:0x1ba551c name="li" children=[#<Nokogiri::XML::Element:0x1ba533c name="a" attributes=[#<Nokogiri::XML::Attr:0x1ba52d8 name="href" value="/wiki/Angerm%C3%BCnde">, #<Nokogiri::XML::Attr:0x1ba52c4 name="title" value="Angermünde">] children=[#<Nokogiri::XML::Text:0x1ba4c84 "Angermünde">]>, #<Nokogiri::XML::Text:0x1ba4ae0 " (Brandenburg)">]>
+ # => #<Nokogiri::XML::Element:0x1ba551c name="li" children=[#<Nokogiri::XML::Element:0x1ba533c name="a" attributes=[#<Nokogiri::XML::Attr:0x1ba52d8 name="href" value="/wiki/Angerm%C3%BCnde">, #<Nokogiri::XML::Attr:0x1ba52c4 name="title" value="Angermünde">] children=[#<Nokogiri::XML::Text:0x1ba4c84 "Angermünde">]>, #<Nokogiri::XML::Text:0x1ba4ae0 " (Brandenburg)">]>
doc = Nokogiri::HTML(open('https://en.wikipedia.org/wiki/List_of_cities_and_towns_in_Germany'))
+ print doc
doc.xpath("//li").map{|x| x.text[0 .. x.text.index('(')-2] if x.text.index('(').present? }.compact
end
- def read_german_cities_and_states_fom_wikipedia
+ def read_german_cities_and_states_from_wikipedia
doc =
- Nokogiri::HTML(open('https://en.wikipedia.org/wiki/List_of_cities_and_towns_in_Germany'))
- doc.xpath("//li").map do |x|
- if x.text.index('(').present?
- [ x.text[0 .. x.text.index('(')-2] , x.text[ x.text.index('(')+1 .. x.text.index(')')-1] ]
+ Nokogiri::HTML(open('https://en.wikipedia.org/wiki/List_of_cities_and_towns_in_Germany'))
+ doc.xpath("//li").map do |x|
+ if x.text.index('(').present?
+ [ x.text[0 .. x.text.index('(')-2] , x.text[ x.text.index('(')+1 .. x.text.index(')')-1] ]
end
end.compact
- end
+ end
end # module
- class StreetExample
+class StreetExample
- include DataImport
- def initialize db, rebuild: true
- if rebuild
- ActiveOrient::OrientDB.logger.progname = "StreetsExample#Initialize"
- db.delete_class :state
- db.delete_class :city
- db.delete_class :street
- db.delete_class :connects
- db.create_vertex_class :state
- db.create_vertex_class :city
- db.create_vertex_class :street
- db.create_edge_class :connects
- ActiveOrient::Model::State.create_property( :name, type: :string, index: :unique )
- ActiveOrient::Model::City.create_properties( { name: { type: :string },
- state: { type: :link, :linked_class => 'State' } }
- ) do
- { citi_idx: :unique }
- end
- ActiveOrient::Model::Street.create_property :name , type: :string, index: :notunique
- ActiveOrient::Model::Connects.create_property :distance, type: :integer, index: :notunique
- ActiveOrient::OrientDB.logger.info { "Vertex- and Edge-Classes rebuilded" }
+ include DataImport
+ def initialize db, rebuild: true
+ if rebuild
+ db.delete_class :State
+ db.delete_class :City
+ db.delete_class :Street
+ db.delete_class :CONNECTS
+ db.create_vertex_class :State
+ db.create_vertex_class :City
+ db.create_vertex_class :Street
+ db.create_edge_class :CONNECTS
+ ActiveOrient::Model::State.create_property( :name, type: :string, index: :unique )
+ ActiveOrient::Model::City.create_properties( { name: { type: :string },
+ state: { type: :link, :linked_class => 'State' } }
+ ) do
+ { citi_idx: :unique }
end
+ ActiveOrient::Model::Street.create_property :name , type: :string, index: :notunique
+ ActiveOrient::Model::CONNECTS.create_property :distance, type: :integer, index: :notunique
+ ActiveOrient::OrientDB.logger.progname = "StreetsExample#Initialize"
+ ActiveOrient::OrientDB.logger.info { "Vertex- and Edge-Classes rebuilded" }
end
+ end
- def read_from_web
- ActiveOrient::OrientDB.logger.progname = "StreetsExample#ReadFromWeb"
- read_german_cities_and_states_fom_wikipedia.each do |city,state|
- state = State.update_or_create( where: { name: state }).first
- City.create name: city, state: state.link
- end
- ActiveOrient::OrientDB.logger.info { "#{City.count} Cities imported from Wikipedia " }
+ def read_from_web
+ read_german_cities_and_states_from_wikipedia.each do |city,state|
+ state = State.update_or_create( where: { name: state }).first
+ City.create name: city, state: "##{state.rid}"
+ end
+ ActiveOrient::OrientDB.logger.progname = "StreetsExample#ReadFromWeb"
+ ActiveOrient::OrientDB.logger.info { "#{City.count} Cities imported from Wikipedia " }
- cities_rids = City.all.map &:link
- read_german_street_names.each_with_index do |street, i|
- street_record = Street.create name: street
- count = i
- cities = Array.new
- while count < cities_rids.size && cities.size < 5 do
- cities << cities_rids[count]
- count = count + i
- end
- C.create_edge :from => street_record, :to => cities
+ cities_rids = City.all.map &:rid
+ read_german_street_names.each_with_index do |street, i|
+ street_record = Street.create name: street
+ count = i
+ cities = Array.new
+ while count < cities_rids.size && cities.size < 5 do
+ cities << cities_rids[count]
+ count = count + i
end
- ActiveOrient::OrientDB.logger.info { "#{C.count} Edges between Streets and Cities created " }
+ C.create_edge :from => street_record, :to => cities
end
-
- def display_streets_per_state
- State.all.each do |state|
- streets= Street.all.map do |street |
- if street.connects.in.detect{|x| x.state == state }
- street.name + " verbindet " + street.connects.in.map( &:name ).join('; ')
- end
- end.compact
- unless streets.empty?
- puts "..................................."
- puts state.name
- puts "..................................."
- puts streets.join("\n")
- end
+ ActiveOrient::OrientDB.logger.progname = "StreetsExample#ReadFromWeb"
+ ActiveOrient::OrientDB.logger.info { "#{C.count} Edges between Streets and Cities created " }
+ end
+
+ def display_streets_per_state
+ State.all.each do |state|
+ streets= Street.all.map do |street |
+ if street.connects.in.detect{|x| x.state == state }
+ street.name + " connects " + street.connects.in.map( &:name ).join('; ')
+ end
+ end.compact
+ unless streets.empty?
+ puts "..................................."
+ puts state.name
+ puts "..................................."
+ puts streets.join("\n")
end
end
- end
+ end
+end
if $0 == __FILE__
-require '../config/boot'
-require 'open-uri'
-require 'nokogiri'
+ require '../config/boot'
+ require 'open-uri'
+ require 'nokogiri'
- ActiveOrient::OrientDB.default_server= { user: 'hctw', password: 'hc' }
- r = ActiveOrient::OrientDB.new database: 'StreetTest'
- ActiveOrient::OrientDB.logger.level = Logger::INFO
- s= StreetExample.new r, rebuild: true
-
- City = r.open_class :city
- State = r.open_class :state
- Street = r.open_class :street
- C = r.open_class :connects
-
- s.read_from_web if City.count.zero?
- s.display_streets_per_state
+ ActiveOrient::OrientDB.default_server= { user: 'root', password: 'tretretre' }
+ r = ActiveOrient::OrientDB.new database: 'StreetTest'
+ ActiveOrient::OrientDB.logger.level = Logger::INFO
+ s= StreetExample.new r, rebuild: true
+
+ City = r.open_class :City
+ State = r.open_class :State
+ Street = r.open_class :Street
+ C = r.open_class :CONNECTS
+
+ s.read_from_web if City.count.zero?
+ s.display_streets_per_state
end