neo4j 1.0.0.beta.21-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/CHANGELOG +141 -0
- data/CONTRIBUTORS +17 -0
- data/Gemfile +16 -0
- data/README.rdoc +135 -0
- data/lib/generators/neo4j.rb +65 -0
- data/lib/generators/neo4j/model/model_generator.rb +39 -0
- data/lib/generators/neo4j/model/templates/model.erb +7 -0
- data/lib/neo4j.rb +77 -0
- data/lib/neo4j/config.rb +153 -0
- data/lib/neo4j/database.rb +56 -0
- data/lib/neo4j/equal.rb +21 -0
- data/lib/neo4j/event_handler.rb +116 -0
- data/lib/neo4j/index/class_methods.rb +62 -0
- data/lib/neo4j/index/index.rb +33 -0
- data/lib/neo4j/index/indexer.rb +312 -0
- data/lib/neo4j/index/indexer_registry.rb +68 -0
- data/lib/neo4j/index/lucene_query.rb +191 -0
- 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 +21 -0
- data/lib/neo4j/mapping/class_methods/init_node.rb +50 -0
- data/lib/neo4j/mapping/class_methods/init_rel.rb +35 -0
- data/lib/neo4j/mapping/class_methods/list.rb +13 -0
- data/lib/neo4j/mapping/class_methods/property.rb +82 -0
- data/lib/neo4j/mapping/class_methods/relationship.rb +91 -0
- data/lib/neo4j/mapping/class_methods/rule.rb +295 -0
- data/lib/neo4j/mapping/decl_relationship_dsl.rb +214 -0
- data/lib/neo4j/mapping/has_list.rb +134 -0
- data/lib/neo4j/mapping/has_n.rb +83 -0
- data/lib/neo4j/mapping/node_mixin.rb +112 -0
- data/lib/neo4j/mapping/relationship_mixin.rb +120 -0
- data/lib/neo4j/model.rb +4 -0
- data/lib/neo4j/neo4j.rb +95 -0
- data/lib/neo4j/node.rb +131 -0
- data/lib/neo4j/node_mixin.rb +4 -0
- data/lib/neo4j/node_relationship.rb +149 -0
- data/lib/neo4j/node_traverser.rb +157 -0
- data/lib/neo4j/property.rb +111 -0
- data/lib/neo4j/rails/attributes.rb +155 -0
- data/lib/neo4j/rails/callbacks.rb +34 -0
- data/lib/neo4j/rails/finders.rb +134 -0
- data/lib/neo4j/rails/lucene_connection_closer.rb +19 -0
- data/lib/neo4j/rails/mapping/property.rb +60 -0
- data/lib/neo4j/rails/model.rb +105 -0
- data/lib/neo4j/rails/persistence.rb +260 -0
- data/lib/neo4j/rails/railtie.rb +21 -0
- data/lib/neo4j/rails/relationships/mapper.rb +96 -0
- data/lib/neo4j/rails/relationships/relationship.rb +30 -0
- data/lib/neo4j/rails/relationships/relationships.rb +60 -0
- data/lib/neo4j/rails/serialization.rb +25 -0
- data/lib/neo4j/rails/timestamps.rb +65 -0
- data/lib/neo4j/rails/transaction.rb +67 -0
- data/lib/neo4j/rails/tx_methods.rb +15 -0
- data/lib/neo4j/rails/validations.rb +38 -0
- data/lib/neo4j/rails/validations/non_nil.rb +11 -0
- data/lib/neo4j/rails/validations/uniqueness.rb +37 -0
- data/lib/neo4j/relationship.rb +169 -0
- data/lib/neo4j/relationship_mixin.rb +4 -0
- data/lib/neo4j/relationship_traverser.rb +92 -0
- data/lib/neo4j/to_java.rb +31 -0
- data/lib/neo4j/transaction.rb +68 -0
- data/lib/neo4j/type_converters.rb +117 -0
- data/lib/neo4j/version.rb +3 -0
- data/lib/orm_adapter/adapters/neo4j.rb +55 -0
- data/lib/tmp/neo4j/active_tx_log +1 -0
- data/lib/tmp/neo4j/index/lucene-store.db +0 -0
- data/lib/tmp/neo4j/index/lucene.log.active +0 -0
- data/lib/tmp/neo4j/lucene-fulltext/lucene-store.db +0 -0
- data/lib/tmp/neo4j/lucene-fulltext/lucene.log.active +0 -0
- data/lib/tmp/neo4j/lucene/lucene-store.db +0 -0
- data/lib/tmp/neo4j/lucene/lucene.log.active +0 -0
- data/lib/tmp/neo4j/messages.log +85 -0
- data/lib/tmp/neo4j/neostore +0 -0
- data/lib/tmp/neo4j/neostore.id +0 -0
- data/lib/tmp/neo4j/neostore.nodestore.db +0 -0
- data/lib/tmp/neo4j/neostore.nodestore.db.id +0 -0
- data/lib/tmp/neo4j/neostore.propertystore.db +0 -0
- data/lib/tmp/neo4j/neostore.propertystore.db.arrays +0 -0
- data/lib/tmp/neo4j/neostore.propertystore.db.arrays.id +0 -0
- data/lib/tmp/neo4j/neostore.propertystore.db.id +0 -0
- data/lib/tmp/neo4j/neostore.propertystore.db.index +0 -0
- data/lib/tmp/neo4j/neostore.propertystore.db.index.id +0 -0
- data/lib/tmp/neo4j/neostore.propertystore.db.index.keys +0 -0
- data/lib/tmp/neo4j/neostore.propertystore.db.index.keys.id +0 -0
- data/lib/tmp/neo4j/neostore.propertystore.db.strings +0 -0
- data/lib/tmp/neo4j/neostore.propertystore.db.strings.id +0 -0
- data/lib/tmp/neo4j/neostore.relationshipstore.db +0 -0
- data/lib/tmp/neo4j/neostore.relationshipstore.db.id +0 -0
- data/lib/tmp/neo4j/neostore.relationshiptypestore.db +0 -0
- data/lib/tmp/neo4j/neostore.relationshiptypestore.db.id +0 -0
- data/lib/tmp/neo4j/neostore.relationshiptypestore.db.names +0 -0
- data/lib/tmp/neo4j/neostore.relationshiptypestore.db.names.id +0 -0
- data/lib/tmp/neo4j/nioneo_logical.log.active +0 -0
- data/lib/tmp/neo4j/tm_tx_log.1 +0 -0
- data/neo4j.gemspec +31 -0
- metadata +216 -0
@@ -0,0 +1,120 @@
|
|
1
|
+
module Neo4j::Mapping
|
2
|
+
|
3
|
+
module RelationshipMixin
|
4
|
+
extend Forwardable
|
5
|
+
include Neo4j::Index
|
6
|
+
|
7
|
+
def_delegators :@_java_rel, :[]=, :[], :property?, :props, :attributes, :update, :neo_id, :id, :to_param, :getId,
|
8
|
+
:equal?, :eql?, :==, :delete, :getStartNode, :getEndNode, :getOtherNode, :exist?
|
9
|
+
|
10
|
+
|
11
|
+
|
12
|
+
# --------------------------------------------------------------------------
|
13
|
+
# Initialization methods
|
14
|
+
#
|
15
|
+
|
16
|
+
|
17
|
+
# Init this node with the specified java neo4j relationship.
|
18
|
+
#
|
19
|
+
def init_on_load(java_rel) # :nodoc:
|
20
|
+
@_java_rel = java_rel
|
21
|
+
end
|
22
|
+
|
23
|
+
|
24
|
+
# Creates a new node and initialize with given properties.
|
25
|
+
#
|
26
|
+
def init_on_create(*args) # :nodoc:
|
27
|
+
type, from_node, to_node, props = args
|
28
|
+
self[:_classname] = self.class.to_s
|
29
|
+
if props.respond_to?(:each_pair)
|
30
|
+
props.each_pair { |k, v| @_java_rel.set_property(k.to_s, v) }
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
|
35
|
+
# --------------------------------------------------------------------------
|
36
|
+
# Instance Methods
|
37
|
+
#
|
38
|
+
|
39
|
+
# Returns the org.neo4j.graphdb.Relationship wrapped object
|
40
|
+
def _java_rel
|
41
|
+
@_java_rel
|
42
|
+
end
|
43
|
+
|
44
|
+
# Returns the end node of this relationship
|
45
|
+
def end_node
|
46
|
+
id = getEndNode.getId
|
47
|
+
Neo4j::Node.load(id)
|
48
|
+
end
|
49
|
+
|
50
|
+
# Returns the start node of this relationship
|
51
|
+
def start_node
|
52
|
+
id = getStartNode.getId
|
53
|
+
Neo4j::Node.load(id)
|
54
|
+
end
|
55
|
+
|
56
|
+
# Deletes this relationship
|
57
|
+
def del
|
58
|
+
delete
|
59
|
+
end
|
60
|
+
|
61
|
+
def exist?
|
62
|
+
Neo4j::Relationship.exist?(self)
|
63
|
+
end
|
64
|
+
|
65
|
+
# A convenience operation that, given a node that is attached to this relationship, returns the other node.
|
66
|
+
# For example if node is a start node, the end node will be returned, and vice versa.
|
67
|
+
# This is a very convenient operation when you're manually traversing the node space by invoking one of the #rels operations on node.
|
68
|
+
#
|
69
|
+
# This operation will throw a runtime exception if node is neither this relationship's start node nor its end node.
|
70
|
+
#
|
71
|
+
# ==== Example
|
72
|
+
# For example, to get the node "at the other end" of a relationship, use the following:
|
73
|
+
# Node endNode = node.rel(:some_rel_type).other_node(node)
|
74
|
+
#
|
75
|
+
def other_node(node)
|
76
|
+
neo_node = node.respond_to?(:_java_node)? node._java_node : node
|
77
|
+
id = getOtherNode(neo_node).getId
|
78
|
+
Neo4j::Node.load(id)
|
79
|
+
end
|
80
|
+
|
81
|
+
|
82
|
+
# Returns the neo relationship type that this relationship is used in.
|
83
|
+
# (see java API org.neo4j.graphdb.Relationship#getType and org.neo4j.graphdb.RelationshipType)
|
84
|
+
#
|
85
|
+
# ==== Returns
|
86
|
+
# the relationship type (of type Symbol)
|
87
|
+
#
|
88
|
+
def relationship_type
|
89
|
+
get_type.name.to_sym
|
90
|
+
end
|
91
|
+
|
92
|
+
# --------------------------------------------------------------------------
|
93
|
+
# Class Methods
|
94
|
+
#
|
95
|
+
|
96
|
+
class << self
|
97
|
+
def included(c) # :nodoc:
|
98
|
+
c.instance_eval do
|
99
|
+
class << self
|
100
|
+
alias_method :orig_new, :new
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|
104
|
+
c.class_inheritable_hash :_decl_props
|
105
|
+
c._decl_props ||= {}
|
106
|
+
|
107
|
+
c.extend ClassMethods::Property
|
108
|
+
c.extend ClassMethods::InitRel
|
109
|
+
c.extend Neo4j::Index::ClassMethods
|
110
|
+
|
111
|
+
def c.inherited(subclass)
|
112
|
+
subclass.rel_indexer subclass
|
113
|
+
super
|
114
|
+
end
|
115
|
+
|
116
|
+
c.rel_indexer c
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
120
|
+
end
|
data/lib/neo4j/model.rb
ADDED
data/lib/neo4j/neo4j.rb
ADDED
@@ -0,0 +1,95 @@
|
|
1
|
+
# = Neo4j
|
2
|
+
#
|
3
|
+
# The Neo4j modules is used to interact with an Neo4j Database instance.
|
4
|
+
# You can for example start and stop an instance and list all the nodes that exist in the database.
|
5
|
+
#
|
6
|
+
# === Starting and Stopping Neo4j
|
7
|
+
# You don't normally need to start the Neo4j database since it will be automatically started when needed.
|
8
|
+
# Before the database is started you should configure where the database is stored, see Neo4j::Config.
|
9
|
+
#
|
10
|
+
module Neo4j
|
11
|
+
|
12
|
+
class << self
|
13
|
+
|
14
|
+
# Start Neo4j using the default database.
|
15
|
+
# This is usally not required since the database will be started automatically when it is used.
|
16
|
+
#
|
17
|
+
def start
|
18
|
+
db = default_db
|
19
|
+
db.start unless db.running?
|
20
|
+
end
|
21
|
+
|
22
|
+
|
23
|
+
# sets the default database to use
|
24
|
+
def default_db=(my_db)
|
25
|
+
@db = my_db
|
26
|
+
end
|
27
|
+
|
28
|
+
# Returns default database. Creates a new one if it does not exist, but does not start it.
|
29
|
+
def default_db
|
30
|
+
@db ||= Database.new
|
31
|
+
end
|
32
|
+
|
33
|
+
# Returns a started db instance. Starts it if's not running.
|
34
|
+
def started_db
|
35
|
+
db = default_db
|
36
|
+
db.start unless db.running?
|
37
|
+
db
|
38
|
+
end
|
39
|
+
|
40
|
+
|
41
|
+
# Returns an unstarted db instance
|
42
|
+
#
|
43
|
+
# This is typically used for configuring the database, which must sometimes
|
44
|
+
# be done before the database is started
|
45
|
+
# if the database was already started an exception will be raised
|
46
|
+
def unstarted_db
|
47
|
+
@db ||= Database.new
|
48
|
+
raise "database was already started" if @db.running?
|
49
|
+
@db
|
50
|
+
end
|
51
|
+
|
52
|
+
# returns true if the database is running
|
53
|
+
def running?
|
54
|
+
@db && @db.running?
|
55
|
+
end
|
56
|
+
|
57
|
+
|
58
|
+
# Stops this database
|
59
|
+
# There are Ruby hooks that will do this automatically for you.
|
60
|
+
#
|
61
|
+
def shutdown(this_db = @db)
|
62
|
+
this_db.shutdown if this_db
|
63
|
+
end
|
64
|
+
|
65
|
+
# Returns the reference node, which is a "starting point" in the node space.
|
66
|
+
#
|
67
|
+
# Usually, a client attaches relationships to this node that leads into various parts of the node space.
|
68
|
+
# For more information about common node space organizational patterns, see the design guide at http://wiki.neo4j.org/content/Design_Guide
|
69
|
+
#
|
70
|
+
def ref_node(this_db = self.started_db)
|
71
|
+
this_db.graph.reference_node
|
72
|
+
end
|
73
|
+
|
74
|
+
# Returns an Enumerable object for all nodes in the database
|
75
|
+
def all_nodes(this_db = self.started_db)
|
76
|
+
Enumerator.new(this_db, :each_node)
|
77
|
+
end
|
78
|
+
|
79
|
+
# Same as #all_nodes but does not return wrapped nodes but instead raw java node objects.
|
80
|
+
def _all_nodes(this_db = self.started_db)
|
81
|
+
Enumerator.new(this_db, :_each_node)
|
82
|
+
end
|
83
|
+
|
84
|
+
# Returns the Neo4j::EventHandler
|
85
|
+
#
|
86
|
+
def event_handler(this_db = default_db)
|
87
|
+
this_db.event_handler
|
88
|
+
end
|
89
|
+
|
90
|
+
# Ruby to Java type converters
|
91
|
+
def converters
|
92
|
+
Neo4j::Config[:converters] || {}
|
93
|
+
end
|
94
|
+
end
|
95
|
+
end
|
data/lib/neo4j/node.rb
ADDED
@@ -0,0 +1,131 @@
|
|
1
|
+
module Neo4j
|
2
|
+
|
3
|
+
|
4
|
+
|
5
|
+
org.neo4j.kernel.impl.core.NodeProxy.class_eval do
|
6
|
+
include Neo4j::Property
|
7
|
+
include Neo4j::NodeRelationship
|
8
|
+
include Neo4j::Equal
|
9
|
+
include Neo4j::Index
|
10
|
+
|
11
|
+
# Delete the node and all its relationship
|
12
|
+
def del
|
13
|
+
rels.each {|r| r.del}
|
14
|
+
delete
|
15
|
+
end
|
16
|
+
|
17
|
+
# returns true if the node exists in the database
|
18
|
+
def exist?
|
19
|
+
Neo4j::Node.exist?(self)
|
20
|
+
end
|
21
|
+
|
22
|
+
# same as _java_node
|
23
|
+
# Used so that we have same method for both relationship and nodes
|
24
|
+
def wrapped_entity
|
25
|
+
self
|
26
|
+
end
|
27
|
+
|
28
|
+
# Loads the Ruby wrapper for this node
|
29
|
+
# If there is no _classname property for this node then it will simply return itself.
|
30
|
+
# Same as Neo4j::Node.wrapper(node)
|
31
|
+
def wrapper
|
32
|
+
self.class.wrapper(self)
|
33
|
+
end
|
34
|
+
|
35
|
+
def _java_node
|
36
|
+
self
|
37
|
+
end
|
38
|
+
|
39
|
+
def class
|
40
|
+
Neo4j::Node
|
41
|
+
end
|
42
|
+
end
|
43
|
+
|
44
|
+
|
45
|
+
# A node in the graph with properties and relationships to other entities.
|
46
|
+
# Along with relationships, nodes are the core building blocks of the Neo4j data representation model.
|
47
|
+
# Node has three major groups of operations: operations that deal with relationships, operations that deal with properties and operations that traverse the node space.
|
48
|
+
# The property operations give access to the key-value property pairs.
|
49
|
+
# Property keys are always strings. Valid property value types are the primitives(<tt>String</tt>, <tt>Fixnum</tt>, <tt>Float</tt>, <tt>Boolean</tt>), and arrays of those primitives.
|
50
|
+
#
|
51
|
+
# === Instance Methods form Included Mixins
|
52
|
+
# * Neo4j::Property - methods that deal with properties
|
53
|
+
# * Neo4j::NodeRelationship methods for relationship
|
54
|
+
# * Neo4j::Equal equality operators: <tt>eql?</tt>, <tt>equal</tt>, <tt>==</tt>
|
55
|
+
# * Neo4j::Index lucene index methods, like indexing a node
|
56
|
+
#
|
57
|
+
# === Class Methods from Included Mixins
|
58
|
+
# * Neo4j::Index::ClassMethods lucene index class methods, like find
|
59
|
+
# * Neo4j::Load - methods for loading a node
|
60
|
+
#
|
61
|
+
# See also the Neo4j::NodeMixin (Neo4j::Mapping::NodeMixin) if you want to wrap a node with your own Ruby class.
|
62
|
+
#
|
63
|
+
class Node
|
64
|
+
extend Neo4j::Index::ClassMethods
|
65
|
+
extend Neo4j::Load
|
66
|
+
|
67
|
+
self.node_indexer self
|
68
|
+
|
69
|
+
class << self
|
70
|
+
|
71
|
+
# Returns a new neo4j Node.
|
72
|
+
# The return node is actually an Java obejct of type org.neo4j.graphdb.Node java object
|
73
|
+
# which has been extended (see the included mixins for Neo4j::Node).
|
74
|
+
#
|
75
|
+
# The created node will have a unique id - Neo4j::Property#neo_id
|
76
|
+
#
|
77
|
+
# ==== Parameters
|
78
|
+
# *args :: a hash of properties to initialize the node with or nil
|
79
|
+
#
|
80
|
+
# ==== Returns
|
81
|
+
# org.neo4j.graphdb.Node java object
|
82
|
+
#
|
83
|
+
# ==== Examples
|
84
|
+
#
|
85
|
+
# Neo4j::Transaction.run do
|
86
|
+
# Neo4j::Node.new
|
87
|
+
# Neo4j::Node.new :name => 'foo', :age => 100
|
88
|
+
# end
|
89
|
+
#
|
90
|
+
#
|
91
|
+
def new(*args)
|
92
|
+
# the first argument can be an hash of properties to set
|
93
|
+
props = args[0].respond_to?(:each_pair) && args[0]
|
94
|
+
|
95
|
+
# a db instance can be given, is the first argument if that was not a hash, or otherwise the second
|
96
|
+
db = (!props && args[0]) || args[1] || Neo4j.started_db
|
97
|
+
|
98
|
+
node = db.graph.create_node
|
99
|
+
props.each_pair { |k, v| node[k]= v } if props
|
100
|
+
node
|
101
|
+
end
|
102
|
+
|
103
|
+
# create is the same as new
|
104
|
+
alias_method :create, :new
|
105
|
+
|
106
|
+
# Loads a node or wrapped node given a native java node or an id.
|
107
|
+
# If there is a Ruby wrapper for the node then it will create a Ruby object that will
|
108
|
+
# wrap the java node (see Neo4j::NodeMixin).
|
109
|
+
#
|
110
|
+
# If the node does not exist it will return nil
|
111
|
+
#
|
112
|
+
def load(node_id, db = Neo4j.started_db)
|
113
|
+
node = _load(node_id, db)
|
114
|
+
return nil if node.nil?
|
115
|
+
node.wrapper
|
116
|
+
end
|
117
|
+
|
118
|
+
# Same as load but does not return the node as a wrapped Ruby object.
|
119
|
+
#
|
120
|
+
def _load(node_id, db)
|
121
|
+
return nil if node_id.nil?
|
122
|
+
db.graph.get_node_by_id(node_id.to_i)
|
123
|
+
rescue java.lang.IllegalStateException
|
124
|
+
nil # the node has been deleted
|
125
|
+
rescue org.neo4j.graphdb.NotFoundException
|
126
|
+
nil
|
127
|
+
end
|
128
|
+
|
129
|
+
end
|
130
|
+
end
|
131
|
+
end
|
@@ -0,0 +1,149 @@
|
|
1
|
+
module Neo4j
|
2
|
+
|
3
|
+
|
4
|
+
module NodeRelationship
|
5
|
+
include ToJava
|
6
|
+
|
7
|
+
|
8
|
+
# Returns the outgoing nodes for this node.
|
9
|
+
#
|
10
|
+
# ==== Returns
|
11
|
+
# a Neo4j::NodeTraverser which can be used to further specify which nodes should be included
|
12
|
+
# in traversal by using the <tt>depth</tt>, <tt>filter</tt> and <tt>prune</tt> methods.
|
13
|
+
#
|
14
|
+
# ==== Examples
|
15
|
+
# # Find all my friends (nodes of depth 1 of type <tt>friends</tt>)
|
16
|
+
# me.outgoing(:friends).each {|friend| puts friend[:name]}
|
17
|
+
#
|
18
|
+
# # Find all my friends and their friends (nodes of depth 1 of type <tt>friends</tt>)
|
19
|
+
# # me.outgoing(:friends).depth(2).each {|friend| puts friend[:name]}
|
20
|
+
#
|
21
|
+
# # Find all my friends and include my self in the result
|
22
|
+
# me.outgoing(:friends).depth(4).include_start_node.each {...}
|
23
|
+
#
|
24
|
+
# # Find all my friends friends friends, etc. at any depth
|
25
|
+
# me.outgoing(:friends).depth(:all).each {...}
|
26
|
+
#
|
27
|
+
# # Find all my friends friends but do not include my friends (only depth == 2)
|
28
|
+
# me.outgoing(:friends).depth(2).filter{|path| path.length == 2}
|
29
|
+
#
|
30
|
+
# # Find all my friends but 'cut off' some parts of the traversal path
|
31
|
+
# me.outgoing(:friends).depth(42).prune(|path| an_expression_using_path_returning_true_false }
|
32
|
+
#
|
33
|
+
# # Find all my friends and work colleges
|
34
|
+
# me.outgoing(:friends).outgoing(:work).each {...}
|
35
|
+
#
|
36
|
+
# 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.
|
37
|
+
#
|
38
|
+
def outgoing(type)
|
39
|
+
if type
|
40
|
+
NodeTraverser.new(self).outgoing(type)
|
41
|
+
else
|
42
|
+
raise "not implemented yet"
|
43
|
+
NodeTraverser.new(self)
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
|
48
|
+
# Returns the incoming nodes of given type(s).
|
49
|
+
#
|
50
|
+
# See #outgoing
|
51
|
+
#
|
52
|
+
def incoming(type)
|
53
|
+
if type
|
54
|
+
NodeTraverser.new(self).incoming(type)
|
55
|
+
else
|
56
|
+
raise "not implemented yet"
|
57
|
+
NodeTraverser.new(self)
|
58
|
+
end
|
59
|
+
end
|
60
|
+
|
61
|
+
# Returns both incoming and outgoing nodes of given types(s)
|
62
|
+
#
|
63
|
+
# If a type is not given then it will return all types of relationships.
|
64
|
+
#
|
65
|
+
# See #outgoing
|
66
|
+
#
|
67
|
+
def both(type=nil)
|
68
|
+
if type
|
69
|
+
NodeTraverser.new(self).both(type)
|
70
|
+
else
|
71
|
+
NodeTraverser.new(self) # default is both
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
|
76
|
+
# Returns an enumeration of relationship objects.
|
77
|
+
# It always returns relationship of depth one.
|
78
|
+
#
|
79
|
+
# See Neo4j::Relationship
|
80
|
+
#
|
81
|
+
# ==== Examples
|
82
|
+
# # Return both incoming and outgoing relationships
|
83
|
+
# me.rels(:friends, :work).each {|relationship|...}
|
84
|
+
#
|
85
|
+
# # Only return outgoing relationship of given type
|
86
|
+
# me.rels(:friends).outgoing.first.end_node # => my friend node
|
87
|
+
#
|
88
|
+
def rels(*type)
|
89
|
+
RelationshipTraverser.new(self, type, :both)
|
90
|
+
end
|
91
|
+
|
92
|
+
|
93
|
+
# Returns the only relationship of a given type and direction that is attached to this node, or null.
|
94
|
+
# This is a convenience method that is used in the commonly occuring situation where a node has exactly zero or
|
95
|
+
# one relationships of a given type and direction to another node.
|
96
|
+
# Typically this invariant is maintained by the rest of the code: if at any time more than one such relationships
|
97
|
+
# exist, it is a fatal error that should generate an unchecked exception. This method reflects that semantics and
|
98
|
+
# returns either:
|
99
|
+
#
|
100
|
+
# * nil if there are zero relationships of the given type and direction,
|
101
|
+
# * the relationship if there's exactly one, or
|
102
|
+
# * raise an exception in all other cases.
|
103
|
+
def rel(dir, type)
|
104
|
+
result = _rel(dir, type)
|
105
|
+
result && result.wrapper
|
106
|
+
end
|
107
|
+
|
108
|
+
# Same as rel but does not return a ruby wrapped object but instead returns the Java object.
|
109
|
+
def _rel(dir, type)
|
110
|
+
get_single_relationship(type_to_java(type), dir_to_java(dir))
|
111
|
+
end
|
112
|
+
|
113
|
+
# Returns the raw java neo4j relationship object.
|
114
|
+
def _rels(dir=:both, *types)
|
115
|
+
if types.size > 1
|
116
|
+
java_types = types.inject([]) { |result, type| result << type_to_java(type) }.to_java(:'org.neo4j.graphdb.RelationshipType')
|
117
|
+
get_relationships(java_types)
|
118
|
+
elsif types.size == 1
|
119
|
+
get_relationships(type_to_java(types[0], dir_to_java(dir)))
|
120
|
+
elsif dir == :both
|
121
|
+
get_relationships(dir_to_java(dir))
|
122
|
+
else
|
123
|
+
raise "illegal argument, does not accept #{dir} #{types.join(',')} - only dir=:both for any relationship types"
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
# Check if the given relationship exists
|
128
|
+
# Returns true if there are one or more relationships from this node to other nodes
|
129
|
+
# with the given relationship.
|
130
|
+
#
|
131
|
+
# ==== Parameters
|
132
|
+
# type:: the key and value to be set, default any type
|
133
|
+
# dir:: optional default :both (either, :outgoing, :incoming, :both)
|
134
|
+
#
|
135
|
+
# ==== Returns
|
136
|
+
# true if one or more relationships exists for the given type and dir
|
137
|
+
# otherwise false
|
138
|
+
#
|
139
|
+
def rel? (type=nil, dir=:both)
|
140
|
+
if type
|
141
|
+
hasRelationship(type_to_java(type), dir_to_java(dir))
|
142
|
+
else
|
143
|
+
hasRelationship
|
144
|
+
end
|
145
|
+
end
|
146
|
+
|
147
|
+
end
|
148
|
+
|
149
|
+
end
|