cadet 0.1.0-java → 0.1.1-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: 44c6bd53bbc5065234be58f9851fb93fb8b35030
4
- data.tar.gz: e07f2a4322395961deea2586f5dcb18f3bdddd35
3
+ metadata.gz: ca887c03dce61ba0ba05011ce4693ff9b08c19fc
4
+ data.tar.gz: b028f3f77bc89d1beaa4be1f234ecb205f5abb7e
5
5
  SHA512:
6
- metadata.gz: e213c75cca7e02ed89f2369b6c63e60c56a8d976601239b8963d8faf80ec741c6da071d293f0573e339ca6ab2dfb9797f4f7949e6409ac20756de0fdb9339974
7
- data.tar.gz: 9053afd936989c658a6bc230f71c81864585312b9c1453e4dfb41e5f7263fc7e241d4806d2983d17a48a3451dd410a0e1e69618d11efc1fb28353a389d840ecd
6
+ metadata.gz: 0e43b1a700ed9798678ce7f715c6dd4b2f4d7c54a414c150c48eecf641ec22f6e1a3ef489f813ed6f15b3bc5d4ddb0294795fb2f31a33e711b3596f87e8afe81
7
+ data.tar.gz: 868a047761af51e5e257d3a38b9f757b5fc166ae20bae08e88559cbdf987884e5e209bcf86df8039a1b5d5ea88f5e0b35a0ad11c21cbc96287f5241865faff2f
data/.ruby-version ADDED
@@ -0,0 +1 @@
1
+ jruby
data/README.md CHANGED
@@ -7,19 +7,29 @@ Use neo4j via jruby! Nothing else needed, simply add this gem to get the power o
7
7
 
8
8
  super simple. you dont even need to download neo4j.
9
9
 
10
-
10
+ ##Open a session
11
11
  ```ruby
12
12
 
13
13
  require 'cadet'
14
14
 
15
15
  Cadet::Session.open "path/to/graph.db/" do
16
+ #for a batch inserter session:
17
+ #Cadet::BatchInserter::Session.open "path/to/graph.db/" do
18
+ #bear in mind that, the database directory needs to be clean before establishing a BatchInserter session.
16
19
  transaction do
17
20
  Person_by_name("Javad").lives_in_to City_by_name("Chicago")
18
21
  end
19
22
  end
20
23
 
24
+ ```
21
25
 
26
+ ## beginning a transaction
27
+ ```ruby
28
+ transaction do
29
+ #...
30
+ end
22
31
  ```
32
+ Note: transaction effictively does nothing in a BatchInserter session, as transactions are not supported in neo4j's BatchInserter (for performance reasons)
23
33
 
24
34
  ## Getting/creating a node, using label-property-value
25
35
  A node can be retrieved (and implicitly created if it does not exist) via the following syntax:
@@ -53,6 +63,15 @@ Relationship creation can also be chained:
53
63
  Person_by_name("Javad").lives_in_to(City_by_name("Chicago")).city_of_to(State_by_name("Illinois")).state_of_to(Country_by_name("United States"))
54
64
  ```
55
65
 
66
+ A node's relationships can be iterated over via:
67
+ ```ruby
68
+ javad.outgoing(:lives_in).each do |rel|
69
+ #rel is a Cadet#Relationship
70
+ end
56
71
 
57
- Batch insert mode can be used by simply using Cadet::BatchInserter::Session instead of Cadet::Session!
58
- None of your code needs to change.
72
+ chicago.incoming(:lives_in).each do |rel|
73
+ #rel is a Cadet#Relationship
74
+ end
75
+ ```
76
+ Note: this (relationship traversal) does not work in a batch inserter session, atleast not yet.
77
+ The idea is a batch inserter session is used for writing data, as opposed to reading data
@@ -2,9 +2,8 @@ module Cadet
2
2
  module BatchInserter
3
3
  module CadetIndex
4
4
  class Index
5
- def initialize(lucene_index, name, type)
5
+ def initialize(lucene_index, name)
6
6
  @name = name.to_sym
7
- @type = type
8
7
  @property_index = {}
9
8
  @lucene_index = lucene_index
10
9
  end
@@ -21,7 +20,7 @@ module Cadet
21
20
  end
22
21
 
23
22
  def flush
24
- lucene_node_index = @lucene_index.nodeIndex(@name, @type)
23
+ lucene_node_index = @lucene_index.nodeIndex(@name, {"type" => "exact"})
25
24
 
26
25
  @property_index.each do |property, propval_to_node_mappings|
27
26
  propval_to_node_mappings.each do |value, nodes|
@@ -7,11 +7,14 @@ module Cadet
7
7
  @indexes = {}
8
8
  @lucene_index = org.neo4j.index.impl.lucene.LuceneBatchInserterIndexProviderNewImpl.new(db)
9
9
  end
10
- def nodeIndex(label, type = {"type" => "exact"})
11
- @indexes[label.to_sym] ||= CadetIndex::Index.new(@lucene_index, label.to_sym, type)
10
+
11
+ def [](label)
12
+ @indexes[label.to_sym] ||= CadetIndex::Index.new(@lucene_index, label.to_sym)
12
13
  end
13
14
  def shutdown
14
- @indexes.each { |label, index| index.flush }
15
+ @indexes.each do |label, index|
16
+ index.flush
17
+ end
15
18
  end
16
19
  end
17
20
  end
@@ -3,15 +3,15 @@ module Cadet
3
3
  class Node < Cadet::Node
4
4
 
5
5
  def create_outgoing(to, type, properties = {})
6
- Relationship.new @db.createRelationship(@underlying, to.underlying, DynamicRelationshipType.withName(type), properties)
6
+ Cadet::BatchInserter::Session.current_session.create_relationship(self, to, type, properties)
7
7
  end
8
8
 
9
9
  def []= (property, value)
10
- @db.setNodeProperty @underlying, property.to_java_string, value
10
+ Cadet::BatchInserter::Session.current_session.set_node_property(self, property, value)
11
11
  end
12
12
 
13
13
  def [] (property)
14
- @db.getNodeProperties(@underlying)[property.to_java_string]
14
+ Cadet::BatchInserter::Session.current_session.get_node_properties(self)[property.to_s]
15
15
  end
16
16
 
17
17
  def == other_node
@@ -0,0 +1,20 @@
1
+ module Cadet
2
+ module BatchInserter
3
+ class Relationship < Cadet::Relationship
4
+ attr_accessor :underlying
5
+
6
+ def == other_rel
7
+ @underlying == other_rel
8
+ end
9
+
10
+ def []= (property, value)
11
+ Cadet::BatchInserter::Session.current_session.set_relationship_property(self, property, value)
12
+ end
13
+
14
+ def [] (property)
15
+ Cadet::BatchInserter::Session.current_session.get_relationship_properties(self)[property]
16
+ end
17
+
18
+ end
19
+ end
20
+ end
@@ -2,9 +2,13 @@ module Cadet
2
2
  module BatchInserter
3
3
  class Session < Cadet::Session
4
4
 
5
- def initialize(db)
6
- @index_provider = CadetIndex::IndexProvider.new(db)
7
- @db = db
5
+ def initialize(underlying)
6
+ @index_provider = CadetIndex::IndexProvider.new(underlying)
7
+ @underlying = underlying
8
+ end
9
+
10
+ def index_on(label, property, node)
11
+ @index_provider[label].add(node.underlying, property, node[property])
8
12
  end
9
13
 
10
14
  def close
@@ -14,6 +18,7 @@ module Cadet
14
18
 
15
19
  def self.open(location, &block)
16
20
  new(org.neo4j.unsafe.batchinsert.BatchInserters.inserter(location)).tap do |session|
21
+ @@current_session = session
17
22
  if block_given?
18
23
  session.instance_exec(session, &block)
19
24
  session.close
@@ -22,28 +27,47 @@ module Cadet
22
27
  end
23
28
 
24
29
  def constraint(label, property)
25
- @db.createDeferredConstraint(DynamicLabel.label(label))
30
+ @underlying.createDeferredConstraint(DynamicLabel.label(label))
26
31
  .assertPropertyIsUnique(property)
27
32
  .create()
28
33
  end
29
34
 
30
35
  def find_node(label, property, value)
31
- index = @index_provider.nodeIndex(label)
36
+ (node = @index_provider[label].get(property.to_sym, value).first) ?
37
+ Node.new(node) : nil
38
+ end
32
39
 
33
- (node = index.get(property.to_sym, value).first) ?
34
- Node.new(node, @db) : nil
40
+ def create_node(label, properties)
41
+ Node.new(@underlying.createNode(Hash[properties.map { |k,v| [k.to_java_string, v] }], DynamicLabel.label(label)))
35
42
  end
36
43
 
37
- def create_node(label, properties, indexing_property = nil)
38
- Node.new(@db.createNode(properties.inject({}){|result,(k,v)| result[k.to_java_string] = v; result}, DynamicLabel.label(label)), @db).tap do |n|
39
- @index_provider.nodeIndex(label).add(n.underlying, indexing_property.to_sym, properties[indexing_property]) if indexing_property
40
- end
44
+ def get_node(label, property, value)
45
+ find_node(label, property, value) || create_node(label, {property.to_sym => value}).tap { |n| index_on(label, property, n); }
41
46
  end
42
47
 
43
48
  def get_transaction
44
49
  Transaction.new(self)
45
50
  end
46
51
 
52
+ def create_relationship(from, to, type, properties)
53
+ Relationship.new @underlying.createRelationship(from.underlying, to.underlying, DynamicRelationshipType.withName(type), properties)
54
+ end
55
+
56
+ def get_node_properties(node)
57
+ @underlying.getNodeProperties(node.underlying)
58
+ end
59
+
60
+ def set_node_property(node, property, value)
61
+ @underlying.setNodeProperty(node.underlying, property.to_java_string, value)
62
+ end
63
+
64
+ def get_relationship_properties(relationship)
65
+ @underlying.getRelationshipProperties(relationship.underlying)
66
+ end
67
+
68
+ def set_relationship_property(relationship, property, value)
69
+ @underlying.setRelationshipProperty(relationship.underlying, property.to_java_string, value)
70
+ end
47
71
  end
48
72
  end
49
73
  end
data/lib/cadet/node.rb CHANGED
@@ -2,8 +2,7 @@ module Cadet
2
2
  class Node
3
3
  attr_accessor :underlying
4
4
 
5
- def initialize(node, db = nil)
6
- @db = db
5
+ def initialize(node)
7
6
  @underlying = node
8
7
  end
9
8
 
data/lib/cadet/session.rb CHANGED
@@ -1,7 +1,13 @@
1
1
  module Cadet
2
2
  class Session
3
- def initialize(db)
4
- @db = db
3
+ @@current_session = nil
4
+
5
+ def self.current_session
6
+ @@current_session
7
+ end
8
+
9
+ def initialize(underlying)
10
+ @underlying = underlying
5
11
  end
6
12
 
7
13
  def self.open(location = nil, &block)
@@ -9,6 +15,7 @@ module Cadet
9
15
  new(org.neo4j.graphdb.factory.GraphDatabaseFactory.new.newEmbeddedDatabase(location)) :
10
16
  new(org.neo4j.test.TestGraphDatabaseFactory.new.newImpermanentDatabase))
11
17
  .tap do |session|
18
+ @@current_session = session
12
19
  if block_given?
13
20
  session.instance_exec(session, &block)
14
21
  session.close
@@ -17,23 +24,23 @@ module Cadet
17
24
  end
18
25
 
19
26
  def close
20
- @db.shutdown
27
+ @underlying.shutdown
21
28
  end
22
29
 
23
30
  def create_node(label, properties, indexing_property = nil)
24
- Node.new(@db.createNode).tap do |n|
31
+ Node.new(@underlying.createNode).tap do |n|
25
32
  n.add_label label
26
33
  properties.each { |prop, val| n[prop] = val }
27
34
  end
28
35
  end
29
36
 
30
37
  def find_node(label, property, value)
31
- ( node = org.neo4j.helpers.collection.IteratorUtil.firstOrNull(@db.findNodesByLabelAndProperty(DynamicLabel.label(label), property, value)) ) ?
38
+ ( node = org.neo4j.helpers.collection.IteratorUtil.firstOrNull(@underlying.findNodesByLabelAndProperty(DynamicLabel.label(label), property, value)) ) ?
32
39
  Node.new(node) : nil
33
40
  end
34
41
 
35
42
  def get_node(label, property, value)
36
- find_node(label, property, value) || create_node(label, {property.to_sym => value}, property)
43
+ find_node(label, property, value) || create_node(label, {property.to_sym => value})
37
44
  end
38
45
 
39
46
  def get_transaction
@@ -51,14 +58,14 @@ module Cadet
51
58
  end
52
59
 
53
60
  def constraint(label, property)
54
- @db.schema
61
+ @underlying.schema
55
62
  .constraintFor(DynamicLabel.label(label))
56
63
  .assertPropertyIsUnique(property)
57
64
  .create()
58
65
  end
59
66
 
60
67
  def begin_tx
61
- @db.beginTx
68
+ @underlying.beginTx
62
69
  end
63
70
 
64
71
  def method_missing(name, *args, &block)
@@ -72,8 +79,8 @@ module Cadet
72
79
 
73
80
  when /^create_([A-z_]*)$/
74
81
  self.class.class_eval "
75
- def #{name}(value, indexing_property = nil)
76
- create_node :#{$1}, value, indexing_property
82
+ def #{name}(value)
83
+ create_node :#{$1}, value
77
84
  end"
78
85
  return self.send(name, *args, &block)
79
86
  else
data/lib/cadet/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module Cadet
2
- VERSION = "0.1.0"
2
+ VERSION = "0.1.1"
3
3
  end
data/lib/cadet.rb CHANGED
@@ -16,6 +16,7 @@ require 'cadet/transaction'
16
16
 
17
17
  require 'cadet/batch_inserter/session'
18
18
  require 'cadet/batch_inserter/node'
19
+ require 'cadet/batch_inserter/relationship'
19
20
  require 'cadet/batch_inserter/transaction'
20
21
 
21
22
  require 'cadet/batch_inserter/cadet_index/index_provider'
@@ -7,18 +7,21 @@ describe Cadet::BatchInserter do
7
7
  Cadet::BatchInserter::Session.open(Dir.mktmpdir).class.should == Cadet::BatchInserter::Session
8
8
  end
9
9
 
10
- it "it should accept multiple relationships" do
10
+ it "it should also work in batch insert mode" do
11
11
  at = Dir.mktmpdir
12
12
  Cadet::BatchInserter::Session.open(at) do
13
13
  self.class.should == Cadet::BatchInserter::Session
14
14
 
15
15
  transaction do
16
- javad = Person_by_name("Javad")
17
- chicago = City_by_name("Chicago")
18
- houston = City_by_name("Houston")
16
+ Person_by_name("Javad").lives_in_to City_by_name("Chicago")
17
+ Person_by_name("Javad").lives_in_to City_by_name("Houston")
19
18
 
20
- javad.lives_in_to chicago
21
- javad.lives_in_to houston
19
+ City_by_name("Chicago").city_of_to State_by_name("Illinois")
20
+ City_by_name("Houston").city_of_to State_by_name("Texas")
21
+
22
+ Person_by_name("Javad")[:birth_year] = 1988
23
+ City_by_name("Chicago")[:abbreviation] = "CHI"
24
+ City_by_name("Houston")[:abbreviation] = "HOU"
22
25
  end
23
26
  end
24
27
 
@@ -26,7 +29,20 @@ describe Cadet::BatchInserter do
26
29
  transaction do
27
30
  Person_by_name("Javad").outgoing(:lives_in).should =~ [City_by_name("Houston"), City_by_name("Chicago")]
28
31
  Person_by_name("Javad").outgoing(:lives_in).should =~ [City_by_name("Chicago"), City_by_name("Houston")]
32
+
33
+ Person_by_name("Javad").outgoing(:lives_in).outgoing(:city_of).should == [State_by_name("Texas"), State_by_name("Illinois")]
34
+ Person_by_name("Javad").outgoing(:lives_in).outgoing(:city_of).to_a.should =~ [State_by_name("Illinois"), State_by_name("Texas")]
35
+
36
+ Person_by_name("Javad")[:birth_year].should == 1988
37
+ City_by_name("Chicago")[:abbreviation].should == "CHI"
38
+ City_by_name("Houston")[:abbreviation].should == "HOU"
29
39
  end
30
40
  end
31
41
  end
42
+
43
+ it "should allow access to the cadet database session singleton object" do
44
+ Cadet::BatchInserter::Session.open(Dir.mktmpdir) do |session|
45
+ Cadet::BatchInserter::Session.current_session.should == session
46
+ end
47
+ end
32
48
  end
@@ -220,5 +220,13 @@ describe Cadet do
220
220
  end
221
221
  end
222
222
 
223
+ it "should allow access to the cadet database session singleton object" do
224
+ Cadet::Session.open do |session|
225
+ transaction do
226
+ Cadet::Session.current_session.should == session
227
+ end
228
+ end
229
+ end
230
+
223
231
 
224
232
  end
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.1.0
4
+ version: 0.1.1
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-03-12 00:00:00.000000000 Z
11
+ date: 2014-03-26 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: rake
@@ -45,6 +45,7 @@ extensions: []
45
45
  extra_rdoc_files: []
46
46
  files:
47
47
  - .gitignore
48
+ - .ruby-version
48
49
  - .travis.yml
49
50
  - Gemfile
50
51
  - README.md
@@ -55,6 +56,7 @@ files:
55
56
  - lib/cadet/batch_inserter/cadet_index/index.rb
56
57
  - lib/cadet/batch_inserter/cadet_index/index_provider.rb
57
58
  - lib/cadet/batch_inserter/node.rb
59
+ - lib/cadet/batch_inserter/relationship.rb
58
60
  - lib/cadet/batch_inserter/session.rb
59
61
  - lib/cadet/batch_inserter/transaction.rb
60
62
  - lib/cadet/direction.rb
@@ -100,7 +102,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
100
102
  version: '0'
101
103
  requirements: []
102
104
  rubyforge_project:
103
- rubygems_version: 2.2.0
105
+ rubygems_version: 2.1.9
104
106
  signing_key:
105
107
  specification_version: 4
106
108
  summary: ruby wrapper to Neo4j java API