neo4j 1.0.0.beta.20 → 3.0.0.alpha.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/CHANGELOG +243 -0
- data/CONTRIBUTORS +12 -0
- data/Gemfile +10 -11
- data/README.md +23 -0
- data/bin/neo4j-jars +33 -0
- data/config/locales/en.yml +5 -0
- data/config/neo4j/config.yml +98 -0
- data/lib/neo4j.rb +28 -68
- data/lib/neo4j/active_node.rb +60 -0
- data/lib/neo4j/active_node/callbacks.rb +41 -0
- data/lib/neo4j/active_node/has_n.rb +138 -0
- data/lib/neo4j/active_node/has_n/decl_rel.rb +236 -0
- data/lib/neo4j/active_node/has_n/nodes.rb +82 -0
- data/lib/neo4j/active_node/identity.rb +28 -0
- data/lib/neo4j/active_node/initialize.rb +24 -0
- data/lib/neo4j/active_node/labels.rb +142 -0
- data/lib/neo4j/active_node/persistence.rb +193 -0
- data/lib/neo4j/active_node/property.rb +41 -0
- data/lib/neo4j/active_node/rels.rb +11 -0
- data/lib/neo4j/active_node/validations.rb +51 -0
- data/lib/neo4j/railtie.rb +40 -0
- data/lib/neo4j/version.rb +1 -1
- data/lib/neo4j/wrapper.rb +25 -0
- data/neo4j.gemspec +25 -15
- metadata +136 -149
- data/README.rdoc +0 -135
- data/lib/generators/neo4j.rb +0 -65
- data/lib/generators/neo4j/model/model_generator.rb +0 -39
- data/lib/generators/neo4j/model/templates/model.erb +0 -7
- data/lib/neo4j/config.rb +0 -153
- data/lib/neo4j/database.rb +0 -56
- data/lib/neo4j/equal.rb +0 -21
- data/lib/neo4j/event_handler.rb +0 -116
- data/lib/neo4j/index/class_methods.rb +0 -62
- data/lib/neo4j/index/index.rb +0 -33
- data/lib/neo4j/index/indexer.rb +0 -312
- data/lib/neo4j/index/indexer_registry.rb +0 -68
- data/lib/neo4j/index/lucene_query.rb +0 -191
- data/lib/neo4j/jars/geronimo-jta_1.1_spec-1.1.1.jar +0 -0
- data/lib/neo4j/jars/lucene-core-3.0.2.jar +0 -0
- data/lib/neo4j/jars/neo4j-index-1.2-1.2.M03.jar +0 -0
- data/lib/neo4j/jars/neo4j-kernel-1.2-1.2.M03.jar +0 -0
- data/lib/neo4j/jars/neo4j-lucene-index-0.2-1.2.M03.jar +0 -0
- data/lib/neo4j/load.rb +0 -21
- data/lib/neo4j/mapping/class_methods/init_node.rb +0 -50
- data/lib/neo4j/mapping/class_methods/init_rel.rb +0 -35
- data/lib/neo4j/mapping/class_methods/property.rb +0 -80
- data/lib/neo4j/mapping/class_methods/relationship.rb +0 -90
- data/lib/neo4j/mapping/class_methods/root.rb +0 -31
- data/lib/neo4j/mapping/class_methods/rule.rb +0 -295
- data/lib/neo4j/mapping/decl_relationship_dsl.rb +0 -214
- data/lib/neo4j/mapping/has_n.rb +0 -83
- data/lib/neo4j/mapping/node_mixin.rb +0 -97
- data/lib/neo4j/mapping/relationship_mixin.rb +0 -117
- data/lib/neo4j/model.rb +0 -4
- data/lib/neo4j/neo4j.rb +0 -95
- data/lib/neo4j/node.rb +0 -131
- data/lib/neo4j/node_mixin.rb +0 -4
- data/lib/neo4j/node_relationship.rb +0 -149
- data/lib/neo4j/node_traverser.rb +0 -157
- data/lib/neo4j/property.rb +0 -111
- data/lib/neo4j/rails/finders.rb +0 -121
- data/lib/neo4j/rails/lucene_connection_closer.rb +0 -19
- data/lib/neo4j/rails/mapping/property.rb +0 -35
- data/lib/neo4j/rails/model.rb +0 -324
- data/lib/neo4j/rails/railtie.rb +0 -16
- data/lib/neo4j/rails/transaction.rb +0 -67
- data/lib/neo4j/rails/tx_methods.rb +0 -15
- data/lib/neo4j/rails/validations/non_nil.rb +0 -11
- data/lib/neo4j/rails/validations/uniqueness.rb +0 -31
- data/lib/neo4j/rails/value.rb +0 -124
- data/lib/neo4j/rails/value_properties.rb +0 -29
- data/lib/neo4j/relationship.rb +0 -169
- data/lib/neo4j/relationship_mixin.rb +0 -4
- data/lib/neo4j/relationship_traverser.rb +0 -92
- data/lib/neo4j/to_java.rb +0 -31
- data/lib/neo4j/transaction.rb +0 -68
- data/lib/neo4j/type_converters.rb +0 -98
@@ -1,15 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
module Rails
|
3
|
-
module TxMethods
|
4
|
-
def tx_methods(*methods)
|
5
|
-
methods.each do |method|
|
6
|
-
tx_method = "#{method}_in_tx"
|
7
|
-
send(:alias_method, tx_method, method)
|
8
|
-
send(:define_method, method) do |*args|
|
9
|
-
Neo4j::Rails::Transaction.running? ? send(tx_method, *args) : Neo4j::Rails::Transaction.run { send(tx_method, *args) }
|
10
|
-
end
|
11
|
-
end
|
12
|
-
end
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
@@ -1,11 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
module Rails
|
3
|
-
module Validations
|
4
|
-
class NonNilValidator < ActiveModel::EachValidator
|
5
|
-
def validate_each(record, attribute, value)
|
6
|
-
record.errors.add(attribute, :nil, options.merge(:value => value)) if value.nil?
|
7
|
-
end
|
8
|
-
end
|
9
|
-
end
|
10
|
-
end
|
11
|
-
end
|
@@ -1,31 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
module Rails
|
3
|
-
module Validations
|
4
|
-
class UniquenessValidator < ActiveModel::EachValidator
|
5
|
-
def initialize(options)
|
6
|
-
super(options.reverse_merge(:case_sensitive => true))
|
7
|
-
end
|
8
|
-
|
9
|
-
def setup(klass)
|
10
|
-
@attributes.each do |attribute|
|
11
|
-
if klass.index_type_for(attribute) != :exact
|
12
|
-
raise "Can't validate property #{attribute} on class #{klass} since there is no :exact lucene index on that property or the index declaration #{attribute} comes after the validation declaration in #{klass} (try to move it before the validation rules)"
|
13
|
-
end
|
14
|
-
end
|
15
|
-
end
|
16
|
-
|
17
|
-
def validate_each(record, attribute, value)
|
18
|
-
if record.class.find("#{attribute}: \"#{value}\"")
|
19
|
-
record.errors.add(attribute, :taken, options.except(:case_sensitive, :scope).merge(:value => value))
|
20
|
-
end
|
21
|
-
end
|
22
|
-
end
|
23
|
-
|
24
|
-
module ClassMethods
|
25
|
-
def validates_uniqueness_of(*attr_names)
|
26
|
-
validates_with UniquenessValidator, _merge_attributes(attr_names)
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
30
|
-
end
|
31
|
-
end
|
data/lib/neo4j/rails/value.rb
DELETED
@@ -1,124 +0,0 @@
|
|
1
|
-
module Neo4j::Rails
|
2
|
-
|
3
|
-
class Value
|
4
|
-
include ValueProperties
|
5
|
-
include org.neo4j.graphdb.Node
|
6
|
-
|
7
|
-
def initialize(wrapper)
|
8
|
-
@wrapper = wrapper
|
9
|
-
@outgoing_rels = {} # a hash of all relationship with key type
|
10
|
-
end
|
11
|
-
|
12
|
-
def getId
|
13
|
-
nil
|
14
|
-
end
|
15
|
-
|
16
|
-
def create_relationship_to(other_java_node, java_type)
|
17
|
-
outgoing(java_type.name).new(other_java_node)
|
18
|
-
end
|
19
|
-
|
20
|
-
def rel(dir, type)
|
21
|
-
# TODO incoming not implemented, needed ?
|
22
|
-
@outgoing_rels[type.to_s] && @outgoing_rels[type.to_s].rels.first
|
23
|
-
end
|
24
|
-
|
25
|
-
def getRelationships(*args)
|
26
|
-
type = args[0].name
|
27
|
-
outgoing = @outgoing_rels[type]
|
28
|
-
return [] unless outgoing
|
29
|
-
outgoing.rels
|
30
|
-
end
|
31
|
-
|
32
|
-
def wrapper
|
33
|
-
@wrapper
|
34
|
-
end
|
35
|
-
|
36
|
-
def outgoing(type)
|
37
|
-
@outgoing_rels[type.to_s] ||= OutgoingRels.new(self)
|
38
|
-
end
|
39
|
-
|
40
|
-
def save_nested(root_node)
|
41
|
-
valid = true
|
42
|
-
@outgoing_rels.each_pair do |type, rel|
|
43
|
-
rel.each_with_index do |new_node, i|
|
44
|
-
wrapper = new_node.respond_to?(:wrapper) ? new_node.wrapper : new_node
|
45
|
-
if wrapper.save
|
46
|
-
new_rel = Neo4j::Relationship.new(type.to_sym, root_node, wrapper)
|
47
|
-
rel.rels[i].props.each_pair { |property, value| new_rel[property] = value }
|
48
|
-
else
|
49
|
-
valid = false
|
50
|
-
end
|
51
|
-
end
|
52
|
-
end
|
53
|
-
valid
|
54
|
-
end
|
55
|
-
|
56
|
-
# this node doesn't exist in the DB yet
|
57
|
-
def exist?
|
58
|
-
false
|
59
|
-
end
|
60
|
-
|
61
|
-
class Relationship
|
62
|
-
include org.neo4j.graphdb.Relationship
|
63
|
-
include ValueProperties
|
64
|
-
|
65
|
-
attr_reader :end_node, :start_node
|
66
|
-
|
67
|
-
def initialize(from, to)
|
68
|
-
@end_node = to
|
69
|
-
@start_node = from
|
70
|
-
end
|
71
|
-
|
72
|
-
def wrapper
|
73
|
-
self
|
74
|
-
end
|
75
|
-
|
76
|
-
def other_node(other)
|
77
|
-
other == @end_node ? @start_node : @end_node
|
78
|
-
end
|
79
|
-
|
80
|
-
alias_method :getOtherNode, :other_node
|
81
|
-
end
|
82
|
-
|
83
|
-
|
84
|
-
class OutgoingRels
|
85
|
-
include Enumerable
|
86
|
-
attr_reader :rels
|
87
|
-
|
88
|
-
def initialize(start_node)
|
89
|
-
@rels = []
|
90
|
-
@start_node = start_node
|
91
|
-
end
|
92
|
-
|
93
|
-
def <<(other)
|
94
|
-
new(other)
|
95
|
-
self
|
96
|
-
end
|
97
|
-
|
98
|
-
def new(other)
|
99
|
-
new_rel = Relationship.new(@start_node, other)
|
100
|
-
@rels << new_rel
|
101
|
-
new_rel
|
102
|
-
end
|
103
|
-
|
104
|
-
def each
|
105
|
-
@rels.each {|n| yield n.end_node}
|
106
|
-
end
|
107
|
-
|
108
|
-
def clear
|
109
|
-
@rels.clear
|
110
|
-
end
|
111
|
-
|
112
|
-
def empty?
|
113
|
-
@rels.empty?
|
114
|
-
end
|
115
|
-
|
116
|
-
def is_a?(type)
|
117
|
-
# ActionView requires this for nested attributes to work
|
118
|
-
return true if Array == type
|
119
|
-
super
|
120
|
-
end
|
121
|
-
end
|
122
|
-
|
123
|
-
end
|
124
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
# provide some properties before we have a real node or relationship
|
2
|
-
module Neo4j
|
3
|
-
module Rails
|
4
|
-
module ValueProperties
|
5
|
-
include Neo4j::Property
|
6
|
-
|
7
|
-
# override Neo4j::Property#props
|
8
|
-
def props
|
9
|
-
@props ||= {}
|
10
|
-
end
|
11
|
-
|
12
|
-
def has_property?(key)
|
13
|
-
!props[key].nil?
|
14
|
-
end
|
15
|
-
|
16
|
-
def set_property(key,value)
|
17
|
-
props[key] = value
|
18
|
-
end
|
19
|
-
|
20
|
-
def get_property(key)
|
21
|
-
props[key]
|
22
|
-
end
|
23
|
-
|
24
|
-
def remove_property(key)
|
25
|
-
props.delete(key)
|
26
|
-
end
|
27
|
-
end
|
28
|
-
end
|
29
|
-
end
|
data/lib/neo4j/relationship.rb
DELETED
@@ -1,169 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
|
3
|
-
org.neo4j.kernel.impl.core.RelationshipProxy.class_eval do
|
4
|
-
include Neo4j::Property
|
5
|
-
include Neo4j::Equal
|
6
|
-
|
7
|
-
alias_method :_end_node, :getEndNode
|
8
|
-
alias_method :_start_node, :getStartNode
|
9
|
-
alias_method :_other_node, :getOtherNode
|
10
|
-
|
11
|
-
|
12
|
-
def del
|
13
|
-
delete
|
14
|
-
end
|
15
|
-
|
16
|
-
def end_node # :nodoc:
|
17
|
-
getEndNode.wrapper
|
18
|
-
end
|
19
|
-
|
20
|
-
def start_node # :nodoc:
|
21
|
-
getStartNode.wrapper
|
22
|
-
end
|
23
|
-
|
24
|
-
def other_node(node) # :nodoc:
|
25
|
-
getOtherNode(node._java_node).wrapper
|
26
|
-
end
|
27
|
-
|
28
|
-
|
29
|
-
# same as _java_rel
|
30
|
-
# Used so that we have same method for both relationship and nodes
|
31
|
-
def wrapped_entity
|
32
|
-
self
|
33
|
-
end
|
34
|
-
|
35
|
-
def _java_rel
|
36
|
-
self
|
37
|
-
end
|
38
|
-
|
39
|
-
|
40
|
-
# Returns true if the relationship exists
|
41
|
-
def exist?
|
42
|
-
Neo4j::Relationship.exist?(self)
|
43
|
-
end
|
44
|
-
|
45
|
-
# Loads the Ruby wrapper for this node
|
46
|
-
# If there is no _classname property for this node then it will simply return itself.
|
47
|
-
# Same as Neo4j::Node.load_wrapper(node)
|
48
|
-
def wrapper
|
49
|
-
self.class.wrapper(self)
|
50
|
-
end
|
51
|
-
|
52
|
-
|
53
|
-
# Returns the relationship name
|
54
|
-
#
|
55
|
-
# ====Example
|
56
|
-
# a = Neo4j::Node.new
|
57
|
-
# a.outgoing(:friends) << Neo4j::Node.new
|
58
|
-
# a.rels.first.rel_type # => 'friends'
|
59
|
-
#
|
60
|
-
def rel_type
|
61
|
-
getType().name()
|
62
|
-
end
|
63
|
-
|
64
|
-
def class
|
65
|
-
Neo4j::Relationship
|
66
|
-
end
|
67
|
-
|
68
|
-
end
|
69
|
-
|
70
|
-
#
|
71
|
-
# A relationship between two nodes in the graph. A relationship has a start node, an end node and a type.
|
72
|
-
# You can attach properties to relationships with the API specified in Neo4j::JavaPropertyMixin.
|
73
|
-
#
|
74
|
-
# Relationship are created by invoking the << operator on the rels method on the node as follow:
|
75
|
-
# node.outgoing(:friends) << other_node << yet_another_node
|
76
|
-
#
|
77
|
-
# or using the Neo4j::Relationship#new method (which does the same thing):
|
78
|
-
# rel = Neo4j::Relationship.new(:friends, node, other_node)
|
79
|
-
#
|
80
|
-
# The fact that the relationship API gives meaning to start and end nodes implicitly means that all relationships have a direction.
|
81
|
-
# In the example above, rel would be directed from node to otherNode.
|
82
|
-
# A relationship's start node and end node and their relation to outgoing and incoming are defined so that the assertions in the following code are true:
|
83
|
-
#
|
84
|
-
# a = Neo4j::Node.new
|
85
|
-
# b = Neo4j::Node.new
|
86
|
-
# rel = Neo4j::Relationship.new(:some_type, a, b)
|
87
|
-
# # Now we have: (a) --- REL_TYPE ---> (b)
|
88
|
-
#
|
89
|
-
# rel.start_node # => a
|
90
|
-
# rel.end_node # => b
|
91
|
-
#
|
92
|
-
# Furthermore, Neo4j guarantees that a relationship is never "hanging freely,"
|
93
|
-
# i.e. start_node, end_node and other_node are guaranteed to always return valid, non-null nodes.
|
94
|
-
#
|
95
|
-
# See also the Neo4j::RelationshipMixin if you want to wrap a relationship with your own Ruby class.
|
96
|
-
#
|
97
|
-
# === Included Mixins
|
98
|
-
# * Neo4j::Property
|
99
|
-
# * Neo4j::Equal
|
100
|
-
#
|
101
|
-
# (Those mixin are actually not included in the Neo4j::Relationship but instead directly included in the java class org.neo4j.kernel.impl.core.RelationshipProxy)
|
102
|
-
#
|
103
|
-
class Relationship
|
104
|
-
extend Neo4j::Index::ClassMethods
|
105
|
-
|
106
|
-
self.rel_indexer self
|
107
|
-
|
108
|
-
class << self
|
109
|
-
include Neo4j::Load
|
110
|
-
include Neo4j::ToJava
|
111
|
-
|
112
|
-
|
113
|
-
# Returns a org.neo4j.graphdb.Relationship java object (!)
|
114
|
-
# Will trigger a event that the relationship was created.
|
115
|
-
#
|
116
|
-
# === Parameters
|
117
|
-
# type :: the type of relationship
|
118
|
-
# from_node :: the start node of this relationship
|
119
|
-
# end_node :: the end node of this relationship
|
120
|
-
# props :: optional properties for the created relationship
|
121
|
-
#
|
122
|
-
# === Returns
|
123
|
-
# org.neo4j.graphdb.Relationship java object
|
124
|
-
#
|
125
|
-
# === Examples
|
126
|
-
#
|
127
|
-
# Neo4j::Relationship.new :friend, node1, node2, :since => '2001-01-02', :status => 'okey'
|
128
|
-
#
|
129
|
-
def new(type, from_node, to_node, props=nil)
|
130
|
-
java_type = type_to_java(type)
|
131
|
-
rel = from_node._java_node.create_relationship_to(to_node._java_node, java_type)
|
132
|
-
props.each_pair {|k,v| rel[k] = v} if props
|
133
|
-
rel
|
134
|
-
end
|
135
|
-
|
136
|
-
# create is the same as new
|
137
|
-
alias_method :create, :new
|
138
|
-
|
139
|
-
# Loads a relationship or wrapped relationship given a native java relationship or an id.
|
140
|
-
# If there is a Ruby wrapper for the node then it will create a Ruby object that will
|
141
|
-
# wrap the java node (see Neo4j::RelationshipMixin).
|
142
|
-
#
|
143
|
-
# If the relationship does not exist it will return nil
|
144
|
-
#
|
145
|
-
def load(rel_id, db = Neo4j.started_db)
|
146
|
-
rel = _load(rel_id, db)
|
147
|
-
return nil if rel.nil?
|
148
|
-
rel.wrapper
|
149
|
-
end
|
150
|
-
|
151
|
-
# Same as load but does not return the node as a wrapped Ruby object.
|
152
|
-
#
|
153
|
-
def _load(rel_id, db)
|
154
|
-
rel = db.graph.get_relationship_by_id(rel_id.to_i)
|
155
|
-
rel.hasProperty('_classname') # since we want a IllegalStateException which is otherwise not triggered
|
156
|
-
rel
|
157
|
-
rescue java.lang.IllegalStateException
|
158
|
-
nil # the node has been deleted
|
159
|
-
rescue org.neo4j.graphdb.NotFoundException
|
160
|
-
nil
|
161
|
-
end
|
162
|
-
|
163
|
-
end
|
164
|
-
|
165
|
-
end
|
166
|
-
|
167
|
-
end
|
168
|
-
|
169
|
-
|
@@ -1,92 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
|
3
|
-
class RelationshipTraverser
|
4
|
-
include Enumerable
|
5
|
-
include ToJava
|
6
|
-
|
7
|
-
def initialize(node, types, direction)
|
8
|
-
@node = node
|
9
|
-
if types.size > 1
|
10
|
-
@types = types.inject([]) { |result, type| result << type_to_java(type) }.to_java(:'org.neo4j.graphdb.RelationshipType')
|
11
|
-
elsif types.size == 1
|
12
|
-
@type = type_to_java(types[0])
|
13
|
-
end
|
14
|
-
@direction = direction
|
15
|
-
end
|
16
|
-
|
17
|
-
def to_s
|
18
|
-
if @type
|
19
|
-
"#{self.class} [type: #{@type} dir:#{@direction}]"
|
20
|
-
elsif @types
|
21
|
-
"#{self.class} [types: #{@types.join(',')} dir:#{@direction}]"
|
22
|
-
else
|
23
|
-
"#{self.class} [types: ANY dir:#{@direction}]"
|
24
|
-
end
|
25
|
-
end
|
26
|
-
|
27
|
-
def each
|
28
|
-
iter = iterator
|
29
|
-
while (iter.hasNext())
|
30
|
-
rel = iter.next
|
31
|
-
yield rel.wrapper if match_to_other?(rel)
|
32
|
-
end
|
33
|
-
end
|
34
|
-
|
35
|
-
def empty?
|
36
|
-
first == nil
|
37
|
-
end
|
38
|
-
|
39
|
-
def iterator
|
40
|
-
if @types
|
41
|
-
@node.get_relationships(@types).iterator
|
42
|
-
elsif @type
|
43
|
-
@node.get_relationships(@type, dir_to_java(@direction))
|
44
|
-
else
|
45
|
-
@node.get_relationships(dir_to_java(@direction))
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def match_to_other?(rel)
|
50
|
-
if @to_other.nil?
|
51
|
-
true
|
52
|
-
elsif @direction == :outgoing
|
53
|
-
rel._end_node == @to_other
|
54
|
-
elsif @direction == :incoming
|
55
|
-
rel._start_node == @to_other
|
56
|
-
else
|
57
|
-
rel._start_node == @to_other || rel._end_node == @to_other
|
58
|
-
end
|
59
|
-
end
|
60
|
-
|
61
|
-
def to_other(to_other)
|
62
|
-
@to_other = to_other
|
63
|
-
self
|
64
|
-
end
|
65
|
-
|
66
|
-
def del
|
67
|
-
each { |rel| rel.del }
|
68
|
-
end
|
69
|
-
|
70
|
-
def size
|
71
|
-
[*self].size
|
72
|
-
end
|
73
|
-
|
74
|
-
def both
|
75
|
-
@direction = :both
|
76
|
-
self
|
77
|
-
end
|
78
|
-
|
79
|
-
def incoming
|
80
|
-
raise "Not allowed calling incoming when finding several relationships types" if @types
|
81
|
-
@direction = :incoming
|
82
|
-
self
|
83
|
-
end
|
84
|
-
|
85
|
-
def outgoing
|
86
|
-
raise "Not allowed calling outgoing when finding several relationships types" if @types
|
87
|
-
@direction = :outgoing
|
88
|
-
self
|
89
|
-
end
|
90
|
-
|
91
|
-
end
|
92
|
-
end
|