cadet 0.0.1-java → 0.0.2-java

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: abffa401951196b50b8baa617c43be24ceb3c115
4
- data.tar.gz: 7b9a1a911568427d585a7c6771ee1a8bd8bc9402
3
+ metadata.gz: 8c1be93b0e3ce909a38fe4bf95a091ed785e906a
4
+ data.tar.gz: ea7e2b5cc5fbb322d711cb48c8173fa5e9ff1699
5
5
  SHA512:
6
- metadata.gz: 1415ad1dfcd2023a62c3c16c677e0c2f56ae7c5fa923ddbcd939834c57b8f665c7da5993648e996bef4393ff32888670de2e7d42cd82cda22042382055d4ed18
7
- data.tar.gz: 1b75ffe54d7e79b00746f8c4e1fed335c80bef6f9c0e9a5e56577a9cac3a4410a7a05568b09d570068017139e7cfb06c7bff940c3a2e66622582d8e573b17763
6
+ metadata.gz: e7af7bb435086ef5d0aac9cfea1a0359e820f6fbdf0d865eec104d8a84526ccfd7d382eed6812f9569266f01a7aefffa2c44a5bfdef5c541648d020c3daf31e8
7
+ data.tar.gz: da1b888cb8d74039123fae49821bddd657ea4eb0c90146eee25d4e1572a49a2c37d05e4fc267fdf2037ab709ddf441e3a81691fa0b4b53940ac3716477bf3504
data/README.md CHANGED
@@ -1,5 +1,6 @@
1
- new! support for batchinsert mode!
2
- just open the database with Cadet::BatchInserter::BatchInserter.open() instead of Cadet::Session.open()!
1
+ - batchinsert mode ruby based index provider
2
+ - support for batchinsert mode!
3
+ just open the database with Cadet::BatchInserter::Session.open() instead of Cadet::Session.open()!
3
4
  this no-ops transaction, simply yielding to the supplied block.
4
5
 
5
6
  super simple. you dont even need to download neo4j.
@@ -7,7 +8,7 @@ super simple. you dont even need to download neo4j.
7
8
  1. Gemfile
8
9
 
9
10
  ```ruby
10
- gem 'cadet', git: 'https://github.com/karabijavad/cadet'
11
+ gem 'cadet'
11
12
  ```
12
13
  2. ``` bundle install ```
13
14
  3. cadet-example.rb
@@ -16,40 +17,32 @@ super simple. you dont even need to download neo4j.
16
17
 
17
18
  require 'cadet'
18
19
  require 'yaml'
19
-
20
+
20
21
  data = YAML.load_file('legislators-current.yaml')
21
22
 
22
- #open the database, db is now used to interact with the database
23
+ #open the database, db is now used to interact with the database
23
24
  db = Cadet::Session.open("neo4j-community-2.0.0/data/graph.db")
24
-
25
+
25
26
  db.transaction do
26
- begin
27
- #create unique constrains on each of these Labels' 'name' property
28
- ["Legislator", "Party", "Gender", "State"].each {|v| db.constraint v, "name"}
29
- rescue Exception => e # ignore, probably just saying the constraint already exists
30
- end
27
+ ["Legislator", "Party", "Gender", "State"].each {|v| db.constraint v, "name"}
31
28
  end
32
-
33
-
29
+
34
30
  data.each do |leg|
35
31
  #begin a transaction. the transaction will automatically finish at the end of the provided block
36
32
  db.transaction do
37
33
 
38
- #get_a_X(property, value) will find a node labeled 'X', with a property of key 'property', and value 'value'
39
- #if the node is not found, it will create it and return it.
40
- l = db.get_a_Legislator "name", leg["name"]["official_full"] || "no name"
41
- p = db.get_a_Party "name", leg["terms"].first["party"]
42
- g = db.get_a_Gender "name", leg["bio"]["gender"]
43
- s = db.get_a_State "name", leg["terms"].first["state"]
44
-
45
- # automatically create relationships, where the relationship type is the method's name
46
- l.party_to p
47
- l.gender_to g
48
- l.represents_to s
49
-
34
+ #get_a_X_by_y(value) will get or create a node labeled 'X', with a property 'y' of value 'value'
35
+ l = db.get_a_Legislator_by_name leg["name"]["official_full"]
36
+ p = db.get_a_Party_by_name leg["terms"].first["party"]
37
+ g = db.get_a_Gender_by_name leg["bio"]["gender"]
38
+ s = db.get_a_State_by_name leg["terms"].first["state"]
39
+
40
+ l.outgoing(:party) << p
41
+ l.outgoing(:gender) << g
42
+ l.outgoing(:represents) << s
50
43
  end
51
44
  end
52
-
45
+
53
46
  #close the database
54
47
  db.close()
55
48
 
@@ -1,13 +1,14 @@
1
1
  module Cadet
2
2
  module BatchInserter
3
- class BatchInserter < Cadet::Session
3
+ class Session < Cadet::Session
4
+ include_package "org.neo4j.graphdb"
4
5
  include_package "org.neo4j.unsafe.batchinsert"
5
6
  include_package "org.neo4j.index.impl.lucene"
7
+ include_package "org.neo4j.helpers.collection"
6
8
 
7
9
  def initialize(db)
8
10
  @db = db
9
- #@index_provider = LuceneBatchInserterIndexProviderNewImpl.new(db)
10
- @index_provider = Cadet::IndexProvider.new(db)
11
+ @index_provider = Cadet::CadetIndex::IndexProvider.new(db)
11
12
  end
12
13
 
13
14
  def close
@@ -25,24 +26,24 @@ module Cadet
25
26
 
26
27
  def constraint(label, property)
27
28
  index = @index_provider.nodeIndex label, {"type" => "exact"}
28
- index.setCacheCapacity property, 100000
29
29
  end
30
30
 
31
- def find_node_by_label_and_property(label, property, value)
31
+ def find_node(label, property, value)
32
32
  index = @index_provider.nodeIndex label, {"type" => "exact"}
33
- result = org.neo4j.helpers.collection.IteratorUtil.firstOrNull(index.get(property, value))
33
+ result = IteratorUtil.firstOrNull(index.get(property, value))
34
34
  if result
35
- return Cadet::BatchInserter::Node.new(@db, result)
35
+ return Node.new(result, @db)
36
36
  else
37
37
  return nil
38
38
  end
39
39
  end
40
40
 
41
- def create_node_with(label, props={})
42
- n = Cadet::BatchInserter::Node.make @db, props, label
41
+ def create_node(label, prop, value)
42
+ node = @db.createNode props, DynamicLabel.label(label)
43
+ n = Node.new node, @db
43
44
 
44
45
  index = @index_provider.nodeIndex label, {"type" => "exact"}
45
- index.add(n.node, props)
46
+ index.add(n.underlying, prop, value)
46
47
  n
47
48
  end
48
49
  end
@@ -1,24 +1,17 @@
1
1
  module Cadet
2
2
  module BatchInserter
3
3
  class Node < Cadet::Node
4
- attr_accessor :node
5
-
6
- def initialize(db, node)
7
- @db = db
8
- @node = node
4
+ include_package "org.neo4j.graphdb"
5
+ def create_outgoing(to, type, properties = {})
6
+ rel_type = DynamicRelationshipType.withName(type)
7
+ @db.createRelationship(@underlying, to.underlying, rel_type, properties)
9
8
  end
10
9
 
11
- def self.make(db, props = {}, label = '')
12
- node = db.createNode props, org.neo4j.graphdb.DynamicLabel.label(label)
13
- new db, node
10
+ def set_property(prop, val)
11
+ @db.setNodeProperties @underlying, {prop => val}
14
12
  end
15
13
 
16
- def create_outgoing(to, type, properties = {})
17
- rel_type = org.neo4j.graphdb.DynamicRelationshipType.withName(type)
18
- @db.createRelationship(@node, to.node, rel_type, properties)
19
- end
20
- def set_properties(props)
21
- @db.setNodeProperties(@node, props)
14
+ def get_relationships(direction, type)
22
15
  end
23
16
  end
24
17
  end
@@ -0,0 +1,28 @@
1
+ module Cadet
2
+ module CadetIndex
3
+ class Index
4
+ def initialize(lucene_index, name, type)
5
+ @name = name
6
+ @type = type
7
+ @index = {}
8
+ @lucene_index = lucene_index
9
+ end
10
+ def add(node, prop, value)
11
+ @index[prop] ||= {}
12
+ @index[prop][value] = node
13
+ end
14
+ def get(property, value)
15
+ @index[property] ||= {}
16
+ [@index[property][value]]
17
+ end
18
+ def flush
19
+ index = @lucene_index.nodeIndex @name, @type
20
+ @index.each do |property, mappings|
21
+ mappings.each do |value, node|
22
+ index.add(node, {property => value})
23
+ end
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,20 @@
1
+ module Cadet
2
+ module CadetIndex
3
+ class IndexProvider
4
+ include_package "org.neo4j.index.impl.lucene"
5
+ def initialize(db)
6
+ @db = db
7
+ @indexes = {}
8
+ @lucene_index = LuceneBatchInserterIndexProviderNewImpl.new(db)
9
+ end
10
+ def nodeIndex(name, type)
11
+ @indexes[name] ||= Cadet::CadetIndex::Index.new(@lucene_index, name, type)
12
+ end
13
+ def shutdown
14
+ @indexes.each do |name, index|
15
+ index.flush
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
data/lib/cadet/node.rb CHANGED
@@ -1,54 +1,37 @@
1
1
  module Cadet
2
- class Node
3
- attr_accessor :node
2
+ class Node < PropertyContainer
3
+ attr_accessor :underlying
4
4
  include_package "org.neo4j.graphdb"
5
5
 
6
- directions = {
7
- "in" => Direction[0],
8
- "out" => Direction[1],
9
- "both" => Direction[2]
10
- }
11
-
12
- def initialize(node)
13
- @node = node
14
- end
15
- def create_outgoing(to, type)
16
- @node.createRelationshipTo(to.node, DynamicRelationshipType.withName(type))
6
+ def initialize(node, db = nil)
7
+ @db = db
8
+ @underlying = node
17
9
  end
10
+
18
11
  def add_label(label)
19
- @node.addLabel(DynamicLabel.label(label))
12
+ @underlying.addLabel(DynamicLabel.label(label))
20
13
  self
21
14
  end
22
15
 
23
- def method_missing(name, *args)
24
- if name.to_s.end_with? "="
25
- set_property name.to_s.gsub(/=$/, ''), args[0]
26
- elsif name.to_s.end_with? "_to"
27
- create_outgoing args[0], name.to_s.gsub(/_to$/, '')
28
- end
16
+ def set_property(property, value)
17
+ @underlying.setProperty(property, value)
29
18
  end
30
-
31
- def get_single_relationship(type, dir="both")
32
- @node.getSingleRelationship DynamicRelationshipType.withName(type), @directions[dir]
19
+ def get_property(property)
20
+ @underlying.getProperty(property)
33
21
  end
34
22
 
35
- def get_all_relationships
36
- @node.getRelationships()
23
+ def get_relationships(direction, type)
24
+ @underlying.getRelationships(direction, type)
37
25
  end
38
- def get_all_relationships_of_type(type)
39
- @node.getRelationships(DynamicRelationshipType.withName(type))
26
+ def create_outgoing(to, type)
27
+ @underlying.createRelationshipTo(to.underlying, DynamicRelationshipType.withName(type))
40
28
  end
41
- def get_all_relationships_of_type_and_dir(type, dir)
42
- @node.getRelationships DynamicRelationshipType.withName(type), @directions[dir]
29
+ def outgoing(type)
30
+ Cadet::RelationshipTraverser.new(self, Direction::OUTGOING, type)
43
31
  end
44
-
45
- def set_property(property, value)
46
- @node.setProperty(property, value)
47
- end
48
- def set_properties(props)
49
- props.each do |k,v|
50
- set_property(k.to_s, v)
51
- end
32
+ def incoming(type)
33
+ Cadet::RelationshipTraverser.new(self, Direction::INCOMING, type)
52
34
  end
35
+
53
36
  end
54
37
  end
@@ -0,0 +1,13 @@
1
+ module Cadet
2
+ class PropertyContainer #subclasses must implement set_property, get_property
3
+
4
+ def []= (property, value)
5
+ set_property property, value
6
+ end
7
+
8
+ def [] (property)
9
+ get_property property
10
+ end
11
+
12
+ end
13
+ end
@@ -0,0 +1,28 @@
1
+ module Cadet
2
+ class RelationshipTraverser
3
+ include Enumerable
4
+ include_package "org.neo4j.graphdb"
5
+
6
+ def initialize(node, direction, type)
7
+ @node = node
8
+ @type = type
9
+ @direction = direction
10
+
11
+ @relationships = node.get_relationships(direction, DynamicRelationshipType.withName(type))
12
+ end
13
+
14
+ def each
15
+ @relationships.each do |rel|
16
+ yield Node.new rel.getOtherNode(@node.node)
17
+ end
18
+ end
19
+
20
+ def << (othernode)
21
+ if @direction == Direction::OUTGOING
22
+ @node.create_outgoing othernode, @type
23
+ elsif @direction == Direction::INCOMING
24
+ othernode.create_outgoing @node, @type
25
+ end
26
+ end
27
+ end
28
+ end
data/lib/cadet/session.rb CHANGED
@@ -3,6 +3,7 @@ module Cadet
3
3
  include_package "org.neo4j.graphdb"
4
4
  include_package "org.neo4j.graphdb.factory"
5
5
  include_package "org.neo4j.unsafe.batchinsert"
6
+ include_package "org.neo4j.helpers.collection"
6
7
 
7
8
  def initialize(db)
8
9
  @db = db
@@ -15,31 +16,25 @@ module Cadet
15
16
  @db.shutdown
16
17
  end
17
18
 
18
- def create_empty_node
19
- Cadet::Node.new @db.createNode
20
- end
21
-
22
- def create_node_with(label, props = {})
23
- n = Cadet::Node.new @db.createNode
19
+ def create_node(label, property, value)
20
+ n = Node.new @db.createNode
24
21
  n.add_label label
25
- n.set_properties props
22
+ n.set_property property, value
26
23
  n
27
24
  end
28
25
 
29
- def get_node_by_id(id)
30
- Cadet::Node.new @db.getNodeById(id)
26
+ def find_node(label, key, value)
27
+ node = IteratorUtil.firstOrNull @db.findNodesByLabelAndProperty(DynamicLabel.label(label), key, value)
28
+ node ? Node.new(node) : null
31
29
  end
32
30
 
33
- def find_nodes_by_label_and_property(label, key, value)
34
- result = []
35
- @db.findNodesByLabelAndProperty(DynamicLabel.label(label), key, value).each do |node|
36
- result << Cadet::Node.new(node)
31
+ def goc_node(label, property, value)
32
+ n = find_node label, property, value
33
+ if n.nil?
34
+ n = create_node label, property, value
35
+ n[property] = value
37
36
  end
38
- result
39
- end
40
- def find_node_by_label_and_property(label, key, value)
41
- node = org.neo4j.helpers.collection.IteratorUtil.firstOrNull @db.findNodesByLabelAndProperty(DynamicLabel.label(label), key, value)
42
- node ? Cadet::Node.new(node) : null
37
+ n
43
38
  end
44
39
 
45
40
  def transaction
@@ -60,23 +55,9 @@ module Cadet
60
55
  end
61
56
 
62
57
  def method_missing(name, *args)
63
- if match = /get_a_([A-Z][A-Za-z]*)$/.match(name.to_s)
64
- return get_a_node match.captures.first, args[0], args[1]
65
- end
66
- end
67
-
68
- def get_a_node(label, property, value, default_values = {})
69
- n = find_node_by_label_and_property(label, property, value)
70
- if n.nil?
71
- h = {}
72
- h[property] = value
73
- n = create_node_with label, h.merge(default_values)
58
+ if match = /^get_a_([A-Z][A-Za-z]*)_by_([A-z]*)/.match(name)
59
+ return goc_node match.captures[0], match.captures[1], args[0]
74
60
  end
75
- n
76
- end
77
-
78
- def traverser
79
- Cadet::Traversal::Description.new @db.traversalDescription
80
61
  end
81
62
 
82
63
  end
data/lib/cadet/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Cadet
2
- VERSION = "0.0.1"
2
+ VERSION = "0.0.2"
3
3
  end
data/lib/cadet.rb CHANGED
@@ -21,10 +21,10 @@ require 'java'
21
21
  "server-api-2.0.0.jar"].each { |file| require "neo4j/#{file}" }
22
22
 
23
23
  require 'cadet/session'
24
+ require 'cadet/property_container'
24
25
  require 'cadet/node'
25
- require 'cadet/traversal/description'
26
- require 'cadet/traversal/evaluator'
27
- require 'cadet/traversal/path'
26
+ require 'cadet/relationship_traverser'
28
27
  require 'cadet/batch_inserter/batch_inserter'
29
28
  require 'cadet/batch_inserter/node'
30
- require 'cadet/index_provider/index_provider'
29
+ require 'cadet/cadet_index/index_provider'
30
+ require 'cadet/cadet_index/index'
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: cadet
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.1
4
+ version: 0.0.2
5
5
  platform: java
6
6
  authors:
7
7
  - Javad Karabi
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2014-01-30 00:00:00.000000000 Z
11
+ date: 2014-02-03 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -53,12 +53,12 @@ files:
53
53
  - lib/cadet.rb
54
54
  - lib/cadet/batch_inserter/batch_inserter.rb
55
55
  - lib/cadet/batch_inserter/node.rb
56
- - lib/cadet/index_provider/index_provider.rb
56
+ - lib/cadet/cadet_index/index.rb
57
+ - lib/cadet/cadet_index/index_provider.rb
57
58
  - lib/cadet/node.rb
59
+ - lib/cadet/property_container.rb
60
+ - lib/cadet/relationship_traverser.rb
58
61
  - lib/cadet/session.rb
59
- - lib/cadet/traversal/description.rb
60
- - lib/cadet/traversal/evaluator.rb
61
- - lib/cadet/traversal/path.rb
62
62
  - lib/cadet/version.rb
63
63
  - lib/neo4j/README.txt
64
64
  - lib/neo4j/concurrentlinkedhashmap-lru-1.3.1.jar
@@ -102,7 +102,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
102
102
  version: '0'
103
103
  requirements: []
104
104
  rubyforge_project:
105
- rubygems_version: 2.2.1
105
+ rubygems_version: 2.2.0
106
106
  signing_key:
107
107
  specification_version: 4
108
108
  summary: ruby wrapper to Neo4j java API
@@ -1,46 +0,0 @@
1
- module Cadet
2
- class IndexProvider
3
- def initialize(db)
4
- @db = db
5
- @indexes = {}
6
- @lucene_index = org.neo4j.index.impl.lucene.LuceneBatchInserterIndexProviderNewImpl.new(db)
7
- end
8
- def nodeIndex(name, type)
9
- @indexes[name] ||= Cadet::Index.new(@lucene_index, name, type)
10
- end
11
- def shutdown
12
- @indexes.each do |name, index|
13
- index.flush
14
- end
15
- end
16
- end
17
- end
18
-
19
- module Cadet
20
- class Index
21
- def initialize(lucene_index, name, type)
22
- @name = name
23
- @type = type
24
- @index = {}
25
- @lucene_index = lucene_index
26
- end
27
- def setCacheCapacity(property, capacity)
28
- end
29
- def add(node, prop)
30
- @index[prop.first[0]] ||= {}
31
- @index[prop.first[0]][prop.first[1]] = node
32
- end
33
- def get(property, value)
34
- @index[property] ||= {}
35
- [@index[property][value]]
36
- end
37
- def flush
38
- index = @lucene_index.nodeIndex @name, @type
39
- @index.each do |property, mappings|
40
- mappings.each do |value, node|
41
- index.add(node, {property => value})
42
- end
43
- end
44
- end
45
- end
46
- end
@@ -1,30 +0,0 @@
1
- module Cadet
2
- module Traversal
3
- class Description
4
- include_package "org.neo4j.graphdb"
5
-
6
- def initialize(description)
7
- @description = description
8
- self
9
- end
10
-
11
- def relationships(relationship_names)
12
- relationship_names.each do |rel_name|
13
- @description = @description.relationships DynamicRelationshipType.withName(rel_name)
14
- end
15
- self
16
- end
17
-
18
- def evaluator(evaluator)
19
- @description = @description.evaluator evaluator.evaluator
20
- self
21
- end
22
-
23
- def traverse(start_node)
24
- @description.traverse(start_node.node).map do |path|
25
- Cadet::Traversal::Path.new path
26
- end
27
- end
28
- end
29
- end
30
- end
@@ -1,15 +0,0 @@
1
- module Cadet
2
- module Traversal
3
- class Evaluator
4
- include_package "org.neo4j.graphdb.traversal"
5
-
6
- def initialize
7
- @evaluator = Evaluators.toDepth(2)
8
- end
9
-
10
- def evaluator
11
- @evaluator
12
- end
13
- end
14
- end
15
- end
@@ -1,12 +0,0 @@
1
- module Cadet
2
- module Traversal
3
- class Path
4
- def initialize(path)
5
- @path = path
6
- end
7
- def path
8
- @path
9
- end
10
- end
11
- end
12
- end