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 +4 -4
- data/README.md +19 -26
- data/lib/cadet/batch_inserter/batch_inserter.rb +11 -10
- data/lib/cadet/batch_inserter/node.rb +7 -14
- data/lib/cadet/cadet_index/index.rb +28 -0
- data/lib/cadet/cadet_index/index_provider.rb +20 -0
- data/lib/cadet/node.rb +20 -37
- data/lib/cadet/property_container.rb +13 -0
- data/lib/cadet/relationship_traverser.rb +28 -0
- data/lib/cadet/session.rb +15 -34
- data/lib/cadet/version.rb +1 -1
- data/lib/cadet.rb +4 -4
- metadata +7 -7
- data/lib/cadet/index_provider/index_provider.rb +0 -46
- data/lib/cadet/traversal/description.rb +0 -30
- data/lib/cadet/traversal/evaluator.rb +0 -15
- data/lib/cadet/traversal/path.rb +0 -12
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 8c1be93b0e3ce909a38fe4bf95a091ed785e906a
|
4
|
+
data.tar.gz: ea7e2b5cc5fbb322d711cb48c8173fa5e9ff1699
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: e7af7bb435086ef5d0aac9cfea1a0359e820f6fbdf0d865eec104d8a84526ccfd7d382eed6812f9569266f01a7aefffa2c44a5bfdef5c541648d020c3daf31e8
|
7
|
+
data.tar.gz: da1b888cb8d74039123fae49821bddd657ea4eb0c90146eee25d4e1572a49a2c37d05e4fc267fdf2037ab709ddf441e3a81691fa0b4b53940ac3716477bf3504
|
data/README.md
CHANGED
@@ -1,5 +1,6 @@
|
|
1
|
-
|
2
|
-
|
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'
|
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
|
-
|
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
|
-
#
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
l.
|
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
|
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
|
-
|
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
|
31
|
+
def find_node(label, property, value)
|
32
32
|
index = @index_provider.nodeIndex label, {"type" => "exact"}
|
33
|
-
result =
|
33
|
+
result = IteratorUtil.firstOrNull(index.get(property, value))
|
34
34
|
if result
|
35
|
-
return
|
35
|
+
return Node.new(result, @db)
|
36
36
|
else
|
37
37
|
return nil
|
38
38
|
end
|
39
39
|
end
|
40
40
|
|
41
|
-
def
|
42
|
-
|
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.
|
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
|
-
|
5
|
-
|
6
|
-
|
7
|
-
@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
|
12
|
-
|
13
|
-
new db, node
|
10
|
+
def set_property(prop, val)
|
11
|
+
@db.setNodeProperties @underlying, {prop => val}
|
14
12
|
end
|
15
13
|
|
16
|
-
def
|
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 :
|
2
|
+
class Node < PropertyContainer
|
3
|
+
attr_accessor :underlying
|
4
4
|
include_package "org.neo4j.graphdb"
|
5
5
|
|
6
|
-
|
7
|
-
|
8
|
-
|
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
|
-
@
|
12
|
+
@underlying.addLabel(DynamicLabel.label(label))
|
20
13
|
self
|
21
14
|
end
|
22
15
|
|
23
|
-
def
|
24
|
-
|
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
|
-
|
32
|
-
@node.getSingleRelationship DynamicRelationshipType.withName(type), @directions[dir]
|
19
|
+
def get_property(property)
|
20
|
+
@underlying.getProperty(property)
|
33
21
|
end
|
34
22
|
|
35
|
-
def
|
36
|
-
@
|
23
|
+
def get_relationships(direction, type)
|
24
|
+
@underlying.getRelationships(direction, type)
|
37
25
|
end
|
38
|
-
def
|
39
|
-
@
|
26
|
+
def create_outgoing(to, type)
|
27
|
+
@underlying.createRelationshipTo(to.underlying, DynamicRelationshipType.withName(type))
|
40
28
|
end
|
41
|
-
def
|
42
|
-
|
29
|
+
def outgoing(type)
|
30
|
+
Cadet::RelationshipTraverser.new(self, Direction::OUTGOING, type)
|
43
31
|
end
|
44
|
-
|
45
|
-
|
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,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
|
19
|
-
|
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.
|
22
|
+
n.set_property property, value
|
26
23
|
n
|
27
24
|
end
|
28
25
|
|
29
|
-
def
|
30
|
-
|
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
|
34
|
-
|
35
|
-
|
36
|
-
|
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
|
-
|
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 =
|
64
|
-
return
|
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
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/
|
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/
|
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.
|
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-
|
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/
|
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.
|
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
|