cadet 0.1.0-java → 0.1.1-java

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 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