neo4j 1.0.0.beta.27-java → 1.0.0.beta.28-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.
- data/CONTRIBUTORS +1 -0
- data/lib/neo4j.rb +38 -72
- data/lib/neo4j/{algo.rb → algo/algo.rb} +5 -1
- data/lib/neo4j/batch/batch.rb +2 -0
- data/lib/neo4j/batch/indexer.rb +108 -0
- data/lib/neo4j/batch/inserter.rb +168 -0
- data/lib/neo4j/database.rb +13 -8
- data/lib/neo4j/{mapping/class_methods/list.rb → has_list/class_methods.rb} +2 -4
- data/lib/neo4j/has_list/has_list.rb +3 -0
- data/lib/neo4j/{mapping/has_list.rb → has_list/mapping.rb} +2 -2
- data/lib/neo4j/{mapping/class_methods/relationship.rb → has_n/class_methods.rb} +42 -12
- data/lib/neo4j/has_n/decl_relationship_dsl.rb +216 -0
- data/lib/neo4j/has_n/has_n.rb +3 -0
- data/lib/neo4j/{mapping/has_n.rb → has_n/mapping.rb} +16 -7
- data/lib/neo4j/index/index.rb +5 -0
- data/lib/neo4j/index/indexer.rb +27 -22
- data/lib/neo4j/index/lucene_query.rb +3 -1
- data/lib/neo4j/jars/core/neo4j-graph-algo-0.8-1.3.M01.jar +0 -0
- data/lib/neo4j/jars/core/neo4j-index-1.3-1.3.M01.jar +0 -0
- data/lib/neo4j/jars/core/neo4j-kernel-1.3-1.3.M01.jar +0 -0
- data/lib/neo4j/jars/core/neo4j-lucene-index-0.5-1.3.M01.jar +0 -0
- data/lib/neo4j/jars/ha/{neo4j-ha-0.6-SNAPSHOT.jar → neo4j-ha-0.6-1.3.M01.jar} +0 -0
- data/lib/neo4j/jars/ha/neo4j-management-1.3-1.3.M01.jar +0 -0
- data/lib/neo4j/jars/ha/neo4j-shell-1.3-1.3.M01.jar +0 -0
- data/lib/neo4j/migrations/class_methods.rb +102 -0
- data/lib/neo4j/migrations/extensions.rb +10 -9
- data/lib/neo4j/migrations/lazy_node_mixin.rb +50 -0
- data/lib/neo4j/migrations/migration.rb +84 -81
- data/lib/neo4j/migrations/migrations.rb +6 -100
- data/lib/neo4j/migrations/node_mixin.rb +80 -0
- data/lib/neo4j/migrations/ref_node_wrapper.rb +32 -0
- data/lib/neo4j/neo4j.rb +11 -0
- data/lib/neo4j/node.rb +55 -25
- data/lib/neo4j/{mapping/class_methods/init_node.rb → node_mixin/class_methods.rb} +3 -3
- data/lib/neo4j/{mapping → node_mixin}/node_mixin.rb +35 -18
- data/lib/neo4j/{mapping/class_methods/property.rb → property/class_methods.rb} +5 -4
- data/lib/neo4j/{property.rb → property/property.rb} +2 -0
- data/lib/neo4j/rails/finders.rb +21 -7
- data/lib/neo4j/rails/rails.rb +19 -0
- data/lib/neo4j/rails/timestamps.rb +1 -1
- data/lib/neo4j/relationship.rb +7 -0
- data/lib/neo4j/{mapping/class_methods/init_rel.rb → relationship_mixin/class_methods.rb} +4 -4
- data/lib/neo4j/{mapping → relationship_mixin}/relationship_mixin.rb +23 -5
- data/lib/neo4j/rels/rels.rb +85 -0
- data/lib/neo4j/rels/traverser.rb +102 -0
- data/lib/neo4j/{mapping/class_methods/rule.rb → rule/class_methods.rb} +11 -11
- data/lib/neo4j/rule/functions/count.rb +37 -0
- data/lib/neo4j/rule/functions/function.rb +74 -0
- data/lib/neo4j/rule/functions/functions.rb +3 -0
- data/lib/neo4j/rule/functions/sum.rb +29 -0
- data/lib/neo4j/rule/rule.rb +5 -0
- data/lib/neo4j/rule/rule_event_listener.rb +162 -0
- data/lib/neo4j/rule/rule_node.rb +182 -0
- data/lib/neo4j/to_java.rb +0 -14
- data/lib/neo4j/traversal/filter_predicate.rb +25 -0
- data/lib/neo4j/traversal/prune_evaluator.rb +14 -0
- data/lib/neo4j/traversal/rel_expander.rb +31 -0
- data/lib/neo4j/traversal/traversal.rb +90 -0
- data/lib/neo4j/traversal/traverser.rb +173 -0
- data/lib/neo4j/{type_converters.rb → type_converters/type_converters.rb} +0 -0
- data/lib/neo4j/version.rb +1 -1
- data/lib/test.rb~ +2 -0
- data/neo4j.gemspec +11 -10
- metadata +48 -37
- data/lib/neo4j/functions/count.rb +0 -33
- data/lib/neo4j/functions/function.rb +0 -72
- data/lib/neo4j/functions/sum.rb +0 -27
- data/lib/neo4j/jars/core/neo4j-graph-algo-0.8-SNAPSHOT.jar +0 -0
- data/lib/neo4j/jars/core/neo4j-index-1.3-SNAPSHOT.jar +0 -0
- data/lib/neo4j/jars/core/neo4j-kernel-1.3-SNAPSHOT.jar +0 -0
- data/lib/neo4j/jars/core/neo4j-lucene-index-0.5-SNAPSHOT.jar +0 -0
- data/lib/neo4j/jars/ha/neo4j-management-1.3-SNAPSHOT.jar +0 -0
- data/lib/neo4j/jars/ha/neo4j-shell-1.3-SNAPSHOT.jar +0 -0
- data/lib/neo4j/mapping/decl_relationship_dsl.rb +0 -214
- data/lib/neo4j/mapping/rule.rb +0 -158
- data/lib/neo4j/mapping/rule_node.rb +0 -176
- data/lib/neo4j/migrations.rb +0 -12
- data/lib/neo4j/migrations/global_migration.rb +0 -29
- data/lib/neo4j/migrations/lazy_migration_mixin.rb +0 -47
- data/lib/neo4j/migrations/migration_mixin.rb +0 -78
- data/lib/neo4j/node_mixin.rb +0 -4
- data/lib/neo4j/node_relationship.rb +0 -161
- data/lib/neo4j/node_traverser.rb +0 -224
- data/lib/neo4j/relationship_mixin.rb +0 -4
- data/lib/neo4j/relationship_traverser.rb +0 -92
@@ -1,176 +0,0 @@
|
|
1
|
-
module Neo4j::Mapping
|
2
|
-
|
3
|
-
|
4
|
-
class RuleNode
|
5
|
-
attr_reader :rules
|
6
|
-
|
7
|
-
def initialize(clazz)
|
8
|
-
@clazz = clazz
|
9
|
-
@rules = []
|
10
|
-
end
|
11
|
-
|
12
|
-
def to_s
|
13
|
-
"RuleNode #{@clazz}, node #{rule_node} #rules: #{@rules.size}"
|
14
|
-
end
|
15
|
-
|
16
|
-
def node_exist?
|
17
|
-
!Neo4j.ref_node.rel?(@clazz)
|
18
|
-
end
|
19
|
-
|
20
|
-
def create_node
|
21
|
-
Neo4j::Transaction.run do
|
22
|
-
node = Neo4j::Node.new
|
23
|
-
Neo4j.ref_node.outgoing(@clazz) << node
|
24
|
-
node
|
25
|
-
end
|
26
|
-
end
|
27
|
-
|
28
|
-
def inherit(subclass)
|
29
|
-
@rules.each do |rule|
|
30
|
-
subclass.rule rule.rule_name, rule.props, &rule.filter
|
31
|
-
end
|
32
|
-
end
|
33
|
-
|
34
|
-
def delete_node
|
35
|
-
if Neo4j.ref_node.rel?(@clazz)
|
36
|
-
Neo4j.ref_node.outgoing(@clazz).each { |n| n.del }
|
37
|
-
end
|
38
|
-
clear_rule_node
|
39
|
-
end
|
40
|
-
|
41
|
-
def find_node
|
42
|
-
Neo4j.ref_node.rel?(@clazz.to_s) && Neo4j.ref_node._rel(:outgoing, @clazz.to_s)._end_node
|
43
|
-
end
|
44
|
-
|
45
|
-
def on_neo4j_started
|
46
|
-
# initialize the rule node when neo4j starts
|
47
|
-
@rule_node = find_node || create_node
|
48
|
-
end
|
49
|
-
|
50
|
-
def rule_node
|
51
|
-
@rule_node ||= find_node || create_node
|
52
|
-
end
|
53
|
-
|
54
|
-
def rule_node?(node)
|
55
|
-
@rule_node == node
|
56
|
-
end
|
57
|
-
|
58
|
-
def clear_rule_node
|
59
|
-
@rule_node = nil
|
60
|
-
end
|
61
|
-
|
62
|
-
def rule_names
|
63
|
-
@rules.map { |r| r.rule_name }
|
64
|
-
end
|
65
|
-
|
66
|
-
def find_rule(rule_name)
|
67
|
-
@rules.find { |rule| rule.rule_name == rule_name }
|
68
|
-
end
|
69
|
-
|
70
|
-
def add_rule(rule_name, props, &block)
|
71
|
-
@rules << (rule = Rule.new(rule_name, props, &block))
|
72
|
-
rule
|
73
|
-
end
|
74
|
-
|
75
|
-
def remove_rule(rule_name)
|
76
|
-
r = find_rule(rule_name)
|
77
|
-
r && @rules.delete(r)
|
78
|
-
end
|
79
|
-
|
80
|
-
# Return a traversal object with methods for each rule and function.
|
81
|
-
# E.g. Person.all.old or Person.all.sum(:age)
|
82
|
-
def traversal(rule_name)
|
83
|
-
# define method on the traversal
|
84
|
-
traversal = rule_node.outgoing(rule_name)
|
85
|
-
@rules.each do |rule|
|
86
|
-
traversal.filter_method(rule.rule_name) do |path|
|
87
|
-
path.end_node.rel?(rule.rule_name, :incoming)
|
88
|
-
end
|
89
|
-
rule.functions && rule.functions.each do |func|
|
90
|
-
traversal.functions_method(func, self, rule_name)
|
91
|
-
end
|
92
|
-
end
|
93
|
-
traversal
|
94
|
-
end
|
95
|
-
|
96
|
-
def find_function(rule_name, function_name, function_id)
|
97
|
-
rule = find_rule(rule_name)
|
98
|
-
rule.find_function(function_name, function_id)
|
99
|
-
end
|
100
|
-
|
101
|
-
def execute_rules(node, *changes)
|
102
|
-
@rules.each do |rule|
|
103
|
-
execute_rule(rule, node, *changes)
|
104
|
-
execute_other_rules(rule, node)
|
105
|
-
end
|
106
|
-
end
|
107
|
-
|
108
|
-
def execute_other_rules(rule, node)
|
109
|
-
rule.triggers && rule.triggers.each do |rel_type|
|
110
|
-
node.incoming(rel_type).each { |n| n.trigger_rules }
|
111
|
-
end
|
112
|
-
end
|
113
|
-
|
114
|
-
def execute_rule(rule, node, *changes)
|
115
|
-
if rule.execute_filter(node)
|
116
|
-
if connected?(rule.rule_name, node)
|
117
|
-
# it was already connected - the node is in the same rule group but a property has changed
|
118
|
-
execute_update_functions(rule, *changes)
|
119
|
-
else
|
120
|
-
# the node has changed or is in a new rule group
|
121
|
-
connect(rule.rule_name, node)
|
122
|
-
execute_add_functions(rule, *changes)
|
123
|
-
end
|
124
|
-
else
|
125
|
-
if break_connection(rule.rule_name, node)
|
126
|
-
# the node has been removed from a rule group
|
127
|
-
execute_delete_functions(rule, *changes)
|
128
|
-
end
|
129
|
-
end
|
130
|
-
end
|
131
|
-
|
132
|
-
def execute_update_functions(rule, *changes)
|
133
|
-
if functions = find_functions_for_changes(rule, *changes)
|
134
|
-
functions && functions.each { |f| f.update(rule.rule_name, rule_node, changes[1], changes[2]) }
|
135
|
-
end
|
136
|
-
end
|
137
|
-
|
138
|
-
def execute_add_functions(rule, *changes)
|
139
|
-
if functions = find_functions_for_changes(rule, *changes)
|
140
|
-
functions && functions.each { |f| f.add(rule.rule_name, rule_node, changes[2]) }
|
141
|
-
end
|
142
|
-
end
|
143
|
-
|
144
|
-
def execute_delete_functions(rule, *changes)
|
145
|
-
if functions = find_functions_for_changes(rule, *changes)
|
146
|
-
functions.each { |f| f.delete(rule.rule_name, rule_node, changes[1]) }
|
147
|
-
end
|
148
|
-
end
|
149
|
-
|
150
|
-
def find_functions_for_changes(rule, *changes)
|
151
|
-
!changes.empty? && rule.functions_for(changes[0])
|
152
|
-
end
|
153
|
-
|
154
|
-
# work out if two nodes are connected by a particular relationship
|
155
|
-
# uses the end_node to start with because it's more likely to have less relationships to go through
|
156
|
-
# (just the number of superclasses it has really)
|
157
|
-
def connected?(rule_name, end_node)
|
158
|
-
end_node.incoming(rule_name).find { |n| n == rule_node }
|
159
|
-
end
|
160
|
-
|
161
|
-
def connect(rule_name, end_node)
|
162
|
-
rule_node.outgoing(rule_name) << end_node
|
163
|
-
end
|
164
|
-
|
165
|
-
# sever a direct one-to-one relationship if it exists
|
166
|
-
def break_connection(rule_name, end_node)
|
167
|
-
rel = end_node._rels(:incoming, rule_name).find { |r| r._start_node == rule_node }
|
168
|
-
rel && rel.del
|
169
|
-
!rel.nil?
|
170
|
-
end
|
171
|
-
|
172
|
-
end
|
173
|
-
|
174
|
-
|
175
|
-
end
|
176
|
-
|
data/lib/neo4j/migrations.rb
DELETED
@@ -1,12 +0,0 @@
|
|
1
|
-
require 'neo4j/migrations/extensions'
|
2
|
-
require 'neo4j/migrations/lazy_migration_mixin'
|
3
|
-
require 'neo4j/migrations/migration'
|
4
|
-
require 'neo4j/migrations/migration_mixin'
|
5
|
-
require 'neo4j/migrations/migrations'
|
6
|
-
require 'neo4j/migrations/global_migration'
|
7
|
-
|
8
|
-
module Neo4j
|
9
|
-
module Migrations
|
10
|
-
|
11
|
-
end
|
12
|
-
end
|
@@ -1,29 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
|
3
|
-
# This node stores the migrations for Neo4j.migrations
|
4
|
-
# Uses the Neo4j.ref_node for keeping the current version of the db.
|
5
|
-
# When the database starts it will check if it needs to run a migration.
|
6
|
-
class GlobalMigration
|
7
|
-
extend Neo4j::Migrations
|
8
|
-
|
9
|
-
class << self
|
10
|
-
def migrate!(version=nil)
|
11
|
-
_migrate!(self, Neo4j.ref_node, version)
|
12
|
-
end
|
13
|
-
|
14
|
-
def db_version
|
15
|
-
Neo4j.ref_node[:_db_version] || 0
|
16
|
-
end
|
17
|
-
|
18
|
-
# Remote all migration and set migrate_to = nil and set the current version to nil
|
19
|
-
def reset_migrations!
|
20
|
-
@migrations = nil
|
21
|
-
@migrate_to = nil
|
22
|
-
Neo4j::Transaction.run do
|
23
|
-
Neo4j.ref_node[:_db_version] = nil
|
24
|
-
end
|
25
|
-
end
|
26
|
-
end
|
27
|
-
end
|
28
|
-
|
29
|
-
end
|
@@ -1,47 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
|
3
|
-
# Overrides the init_on_load method so that it will check if any migration is needed.
|
4
|
-
# The init_on_create method is also overriden so that it sets the version to the latest migration number
|
5
|
-
# when a new node is created.
|
6
|
-
#
|
7
|
-
# Migration will take place if needed when the node is loaded.
|
8
|
-
#
|
9
|
-
module LazyMigrationMixin
|
10
|
-
extend ActiveSupport::Concern
|
11
|
-
|
12
|
-
included do
|
13
|
-
extend Neo4j::Migrations
|
14
|
-
end
|
15
|
-
|
16
|
-
module ClassMethods
|
17
|
-
# Remote all migration and set migrate_to = nil
|
18
|
-
# Does not change the version of nodes.
|
19
|
-
def reset_migrations!
|
20
|
-
@migrations = nil
|
21
|
-
@migrate_to = nil
|
22
|
-
end
|
23
|
-
end
|
24
|
-
|
25
|
-
def migrate!
|
26
|
-
self.class._migrate!(self._java_node, self)
|
27
|
-
end
|
28
|
-
|
29
|
-
def init_on_create(*)
|
30
|
-
super
|
31
|
-
# set the db version to the current
|
32
|
-
self[:_db_version] = self.class.migrate_to
|
33
|
-
end
|
34
|
-
|
35
|
-
def init_on_load(*) # :nodoc:
|
36
|
-
super
|
37
|
-
migrate!
|
38
|
-
# this if for Neo4j::Rails::Model which keeps the properties in this variable
|
39
|
-
@properties.clear if instance_variable_defined? :@properties
|
40
|
-
end
|
41
|
-
|
42
|
-
def db_version
|
43
|
-
self[:_db_version]
|
44
|
-
end
|
45
|
-
end
|
46
|
-
|
47
|
-
end
|
@@ -1,78 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
|
3
|
-
|
4
|
-
# By including this mixing on a node class one can add migrations to it.
|
5
|
-
# Each class has a unique db version.
|
6
|
-
#
|
7
|
-
# ==== Example
|
8
|
-
#
|
9
|
-
# class Person
|
10
|
-
# include Neo4j::NodeMixin
|
11
|
-
# include MigrationMixin
|
12
|
-
# rule :all # adding the method all to make it possible to find all nodes of this class
|
13
|
-
# end
|
14
|
-
#
|
15
|
-
# Person.migration 1, :split_property do
|
16
|
-
# up do
|
17
|
-
# all.each_raw do |node|
|
18
|
-
# node[:given_name] = node[:name].split[0]
|
19
|
-
# node[:surname] = node[:name].split[1]
|
20
|
-
# node[:name] = nil
|
21
|
-
# end
|
22
|
-
# end
|
23
|
-
#
|
24
|
-
# down do
|
25
|
-
# all.each_raw do |node|
|
26
|
-
# node[:name] = "#{node[:given_name]} #{node[:surname]}"
|
27
|
-
# node[:surename] = nil
|
28
|
-
# node[:given_name] = nil
|
29
|
-
# end
|
30
|
-
# end
|
31
|
-
# end
|
32
|
-
#
|
33
|
-
# Notice that the up and down methods are evaluated in the context of the class (where the all method is defined
|
34
|
-
# if using the rule :all).
|
35
|
-
#
|
36
|
-
module MigrationMixin
|
37
|
-
extend ActiveSupport::Concern
|
38
|
-
|
39
|
-
included do
|
40
|
-
extend Neo4j::Migrations
|
41
|
-
end
|
42
|
-
|
43
|
-
module ClassMethods
|
44
|
-
def migrate!(version=nil)
|
45
|
-
_migrate!(self, migration_meta_node, version)
|
46
|
-
end
|
47
|
-
|
48
|
-
# The node that holds the db version property
|
49
|
-
def migration_meta_node
|
50
|
-
Neo4j::Mapping::Rule.rule_node_for(self).rule_node
|
51
|
-
end
|
52
|
-
|
53
|
-
# Remote all migration and set migrate_to = nil and set the current version to nil
|
54
|
-
def reset_migrations!
|
55
|
-
@migrations = nil
|
56
|
-
@migrate_to = nil
|
57
|
-
Neo4j::Transaction.run do
|
58
|
-
migration_meta_node[:_db_version] = nil
|
59
|
-
end
|
60
|
-
end
|
61
|
-
|
62
|
-
# sets the migration db version for this class on a 'meta' node.
|
63
|
-
def db_version=(version)
|
64
|
-
Neo4j::Transaction.run do
|
65
|
-
migration_meta_node[:_db_version] = version
|
66
|
-
end
|
67
|
-
end
|
68
|
-
|
69
|
-
# returns the current version of the database for this class.
|
70
|
-
def db_version
|
71
|
-
migration_meta_node[:_db_version]
|
72
|
-
end
|
73
|
-
end
|
74
|
-
|
75
|
-
end
|
76
|
-
|
77
|
-
|
78
|
-
end
|
data/lib/neo4j/node_mixin.rb
DELETED
@@ -1,161 +0,0 @@
|
|
1
|
-
module Neo4j
|
2
|
-
|
3
|
-
|
4
|
-
module NodeRelationship
|
5
|
-
include ToJava
|
6
|
-
|
7
|
-
|
8
|
-
# A more powerful alternative of #outgoing, #incoming and #both method.
|
9
|
-
# You can use this method for example to only traverse nodes based on properties on the relationships
|
10
|
-
#
|
11
|
-
# ==== Example
|
12
|
-
#
|
13
|
-
# some_node.expand { |n| n._rels.find_all { |r| r[:age] > 5 } }.depth(:all).to_a
|
14
|
-
#
|
15
|
-
# The above traverse all relationships with a property of age > 5
|
16
|
-
#
|
17
|
-
def expand(&expander)
|
18
|
-
NodeTraverser.new(self).expander(&expander)
|
19
|
-
end
|
20
|
-
|
21
|
-
|
22
|
-
# Returns the outgoing nodes for this node.
|
23
|
-
#
|
24
|
-
# ==== Returns
|
25
|
-
# a Neo4j::NodeTraverser which can be used to further specify which nodes should be included
|
26
|
-
# in traversal by using the <tt>depth</tt>, <tt>filter</tt> and <tt>prune</tt> methods.
|
27
|
-
#
|
28
|
-
# ==== Examples
|
29
|
-
# # Find all my friends (nodes of depth 1 of type <tt>friends</tt>)
|
30
|
-
# me.outgoing(:friends).each {|friend| puts friend[:name]}
|
31
|
-
#
|
32
|
-
# # Find all my friends and their friends (nodes of depth 1 of type <tt>friends</tt>)
|
33
|
-
# # me.outgoing(:friends).depth(2).each {|friend| puts friend[:name]}
|
34
|
-
#
|
35
|
-
# # Find all my friends and include my self in the result
|
36
|
-
# me.outgoing(:friends).depth(4).include_start_node.each {...}
|
37
|
-
#
|
38
|
-
# # Find all my friends friends friends, etc. at any depth
|
39
|
-
# me.outgoing(:friends).depth(:all).each {...}
|
40
|
-
#
|
41
|
-
# # Find all my friends friends but do not include my friends (only depth == 2)
|
42
|
-
# me.outgoing(:friends).depth(2).filter{|path| path.length == 2}
|
43
|
-
#
|
44
|
-
# # Find all my friends but 'cut off' some parts of the traversal path
|
45
|
-
# me.outgoing(:friends).depth(42).prune(|path| an_expression_using_path_returning_true_false }
|
46
|
-
#
|
47
|
-
# # Find all my friends and work colleges
|
48
|
-
# me.outgoing(:friends).outgoing(:work).each {...}
|
49
|
-
#
|
50
|
-
# Of course all the methods <tt>outgoing</tt>, <tt>incoming</tt>, <tt>both</tt>, <tt>depth</tt>, <tt>include_start_node</tt>, <tt>filter</tt>, and <tt>prune</tt> can be combined.
|
51
|
-
#
|
52
|
-
def outgoing(type)
|
53
|
-
if type
|
54
|
-
NodeTraverser.new(self).outgoing(type)
|
55
|
-
else
|
56
|
-
raise "Not implemented getting all types of outgoing relationship. Specify a relationship type"
|
57
|
-
end
|
58
|
-
end
|
59
|
-
|
60
|
-
|
61
|
-
# Returns the incoming nodes of given type(s).
|
62
|
-
#
|
63
|
-
# See #outgoing
|
64
|
-
#
|
65
|
-
def incoming(type)
|
66
|
-
if type
|
67
|
-
NodeTraverser.new(self).incoming(type)
|
68
|
-
else
|
69
|
-
raise "Not implemented getting all types of incoming relationship. Specify a relationship type"
|
70
|
-
end
|
71
|
-
end
|
72
|
-
|
73
|
-
# Returns both incoming and outgoing nodes of given types(s)
|
74
|
-
#
|
75
|
-
# If a type is not given then it will return all types of relationships.
|
76
|
-
#
|
77
|
-
# See #outgoing
|
78
|
-
#
|
79
|
-
def both(type=nil)
|
80
|
-
if type
|
81
|
-
NodeTraverser.new(self).both(type)
|
82
|
-
else
|
83
|
-
NodeTraverser.new(self) # default is both
|
84
|
-
end
|
85
|
-
end
|
86
|
-
|
87
|
-
|
88
|
-
# Returns an enumeration of relationship objects.
|
89
|
-
# It always returns relationship of depth one.
|
90
|
-
#
|
91
|
-
# See Neo4j::Relationship
|
92
|
-
#
|
93
|
-
# ==== Examples
|
94
|
-
# # Return both incoming and outgoing relationships
|
95
|
-
# me.rels(:friends, :work).each {|relationship|...}
|
96
|
-
#
|
97
|
-
# # Only return outgoing relationship of given type
|
98
|
-
# me.rels(:friends).outgoing.first.end_node # => my friend node
|
99
|
-
#
|
100
|
-
def rels(*type)
|
101
|
-
RelationshipTraverser.new(self, type, :both)
|
102
|
-
end
|
103
|
-
|
104
|
-
|
105
|
-
# Returns the only relationship of a given type and direction that is attached to this node, or null.
|
106
|
-
# This is a convenience method that is used in the commonly occuring situation where a node has exactly zero or
|
107
|
-
# one relationships of a given type and direction to another node.
|
108
|
-
# Typically this invariant is maintained by the rest of the code: if at any time more than one such relationships
|
109
|
-
# exist, it is a fatal error that should generate an unchecked exception. This method reflects that semantics and
|
110
|
-
# returns either:
|
111
|
-
#
|
112
|
-
# * nil if there are zero relationships of the given type and direction,
|
113
|
-
# * the relationship if there's exactly one, or
|
114
|
-
# * raise an exception in all other cases.
|
115
|
-
def rel(dir, type)
|
116
|
-
result = _rel(dir, type)
|
117
|
-
result && result.wrapper
|
118
|
-
end
|
119
|
-
|
120
|
-
# Same as rel but does not return a ruby wrapped object but instead returns the Java object.
|
121
|
-
def _rel(dir, type)
|
122
|
-
get_single_relationship(type_to_java(type), dir_to_java(dir))
|
123
|
-
end
|
124
|
-
|
125
|
-
# Returns the raw java neo4j relationship object.
|
126
|
-
def _rels(dir=:both, *types)
|
127
|
-
if types.size > 1
|
128
|
-
java_types = types.inject([]) { |result, type| result << type_to_java(type) }.to_java(:'org.neo4j.graphdb.RelationshipType')
|
129
|
-
get_relationships(java_types)
|
130
|
-
elsif types.size == 1
|
131
|
-
get_relationships(type_to_java(types[0]), dir_to_java(dir))
|
132
|
-
elsif dir == :both
|
133
|
-
get_relationships(dir_to_java(dir))
|
134
|
-
else
|
135
|
-
raise "illegal argument, does not accept #{dir} #{types.join(',')} - only dir=:both for any relationship types"
|
136
|
-
end
|
137
|
-
end
|
138
|
-
|
139
|
-
# Check if the given relationship exists
|
140
|
-
# Returns true if there are one or more relationships from this node to other nodes
|
141
|
-
# with the given relationship.
|
142
|
-
#
|
143
|
-
# ==== Parameters
|
144
|
-
# type:: the key and value to be set, default any type
|
145
|
-
# dir:: optional default :both (either, :outgoing, :incoming, :both)
|
146
|
-
#
|
147
|
-
# ==== Returns
|
148
|
-
# true if one or more relationships exists for the given type and dir
|
149
|
-
# otherwise false
|
150
|
-
#
|
151
|
-
def rel? (type=nil, dir=:both)
|
152
|
-
if type
|
153
|
-
hasRelationship(type_to_java(type), dir_to_java(dir))
|
154
|
-
else
|
155
|
-
hasRelationship
|
156
|
-
end
|
157
|
-
end
|
158
|
-
|
159
|
-
end
|
160
|
-
|
161
|
-
end
|