cadet 0.0.1-java → 0.0.2-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: 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