neo4j-core 0.0.15-java → 2.0.0.alpha.1-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.
Files changed (38) hide show
  1. data/Gemfile +2 -2
  2. data/README.rdoc +12 -192
  3. data/lib/neo4j-core.rb +3 -19
  4. data/lib/neo4j-core/database.rb +5 -4
  5. data/lib/neo4j-core/event_handler.rb +1 -1
  6. data/lib/neo4j-core/index/class_methods.rb +41 -27
  7. data/lib/neo4j-core/index/index.rb +4 -3
  8. data/lib/neo4j-core/index/index_config.rb +23 -30
  9. data/lib/neo4j-core/index/indexer.rb +53 -65
  10. data/lib/neo4j-core/index/indexer_registry.rb +2 -2
  11. data/lib/neo4j-core/index/lucene_query.rb +42 -53
  12. data/lib/neo4j-core/node/class_methods.rb +4 -4
  13. data/lib/neo4j-core/node/node.rb +8 -1
  14. data/lib/neo4j-core/property/property.rb +3 -1
  15. data/lib/neo4j-core/relationship/relationship.rb +10 -8
  16. data/lib/neo4j-core/rels/rels.rb +4 -9
  17. data/lib/neo4j-core/rels/traverser.rb +27 -13
  18. data/lib/neo4j-core/traversal/prune_evaluator.rb +2 -2
  19. data/lib/neo4j-core/traversal/traverser.rb +27 -122
  20. data/lib/neo4j-core/type_converters/type_converters.rb +287 -0
  21. data/lib/neo4j-core/version.rb +1 -1
  22. data/lib/neo4j-core/version.rb~ +3 -0
  23. data/lib/neo4j/config.rb +6 -3
  24. data/lib/neo4j/neo4j.rb +22 -51
  25. data/lib/neo4j/node.rb +0 -27
  26. data/lib/neo4j/relationship.rb +0 -25
  27. data/lib/test.rb +27 -0
  28. data/neo4j-core.gemspec +2 -2
  29. metadata +11 -17
  30. data/lib/neo4j-core/cypher/cypher.rb +0 -969
  31. data/lib/neo4j-core/cypher/result_wrapper.rb +0 -48
  32. data/lib/neo4j-core/hash_with_indifferent_access.rb +0 -165
  33. data/lib/neo4j-core/index/unique_factory.rb +0 -54
  34. data/lib/neo4j-core/property/java.rb +0 -59
  35. data/lib/neo4j-core/wrapper/class_methods.rb +0 -22
  36. data/lib/neo4j-core/wrapper/wrapper.rb +0 -20
  37. data/lib/neo4j/algo.rb +0 -300
  38. data/lib/neo4j/cypher.rb +0 -180
data/Gemfile CHANGED
@@ -2,8 +2,8 @@ source :gemcutter
2
2
 
3
3
  gemspec
4
4
 
5
- gem 'neo4j-advanced', "1.7.0", :require => false
6
- gem 'neo4j-enterprise', "1.7.0", :require => false
5
+ gem 'neo4j-advanced', "1.6.1.alpha.1", :require => false
6
+ gem 'neo4j-enterprise', "1.6.1.alpha.1", :require => false
7
7
 
8
8
  group 'development' do
9
9
  gem 'guard'
data/README.rdoc CHANGED
@@ -1,16 +1,16 @@
1
- == Neo4j-core {<img src="https://secure.travis-ci.org/andreasronge/neo4j-core.png" />}[http://travis-ci.org/andreasronge/neo4j-core]
2
-
3
1
  This gem only contains the JRuby mapping of the Neo4j graph database.
4
- The neo4j.rb gem will be split up into three gems, neo4j-core, {neo4j-wrapper}[http://github.com/andreasronge/neo4j-wrapper] and {neo4j}[http://github.com/andreasronge/neo4j].
5
- This gem will be included by neo4j 2.0.0 gem.
6
-
7
- This gem contains two modules: Neo4j and Neo4j::Core
8
- The Neo4j module is public and the Neo4j::Core(::*) are internal modules.
2
+ The neo4j.rb gem will be split up into two gems, neo4j-core and neo4j.
3
+ This gem will be included by neo4j 2.0.0 gem (if successful).
9
4
 
10
- == Documentation
5
+ Changes from the neo4j.rb
6
+ * Use of YARD instead of RDoc
7
+ * Some tidy up of the API and code (e.g. Neo4j::Node#rels methods)
8
+ * Change of Ruby module structure.
9
+ * More RSpecs and more use of mocking combined with real testing of the Java layer
10
+ * Make sure that we retrieve relationships and nodes lazy if possible.
11
11
 
12
- * {YARD}[http://rdoc.info/github/andreasronge/neo4j-core/file/README.rdoc]
13
- * {Neo4j.rb Wiki}[https://github.com/andreasronge/neo4j/wiki/]
12
+ This gem contains two modules: Neo4j and Neo4j::Core
13
+ The Neo4j modules are public and the Neo4j::Core(::*) are private modules
14
14
 
15
15
  == The public API
16
16
 
@@ -20,186 +20,6 @@ The Neo4j module is public and the Neo4j::Core(::*) are internal modules.
20
20
 
21
21
  {Neo4j} The Database
22
22
 
23
- {Neo4j::Cypher} Cypher Query DSL, see {Neo4j Wiki}[https://github.com/andreasronge/neo4j/wiki/Neo4j%3A%3ACore-Cypher]
24
-
25
- {Neo4j::Algo} Included algorithms, like shortest path
26
-
27
- == Custom Index
28
-
29
- You can create your own indexer.
30
-
31
- class MyIndex
32
- extend Neo4j::Core::Index::ClassMethods
33
- include Neo4j::Core::Index
34
-
35
- node_indexer do
36
- index_names :exact => 'myindex_exact', :fulltext => 'myindex_fulltext'
37
- trigger_on :myindex => true, :things => ['a', 'b']
38
- end
39
-
40
- index :name
41
- end
42
-
43
- All nodes with the property <tt>myindex == true</tt> or property <tt>things</tt> <tt>'a'</tt> or <tt>'b'</tt>
44
- will be indexed using this index.
45
-
46
- Exampel:
47
- n = Neo4j::Node.new(:myindex = true, :name => 'foo')
48
- MyIndex.find('name: foo').first #=> n
49
-
50
-
51
-
52
- == Cypher
53
-
54
- Example:
55
- Neo4j.query { node(3) }
56
-
57
- Example with parameters:
58
- Neo4j.query(Neo4j.ref_node} do |ref|
59
- ref <=> :x
60
- :x
61
- end
62
-
63
- Notice
64
- * The last statement in the expression will be the return value.
65
- * You can skip the start, match, where and ret (they are just empty methods).
66
-
67
- === Cypher Examples
68
-
69
- "START n0=node(3) RETURN n0"
70
- Neo4j.query do
71
- start n = node(3)
72
- ret n
73
- end
74
- # the above is same as:
75
- Neo4j.query { node(3) }
76
-
77
- "START n0=node(42) RETURN n0"
78
- node(Neo4j::Node.new)
79
-
80
- "START r0=relationship(3,4) RETURN r0"
81
- rel(3,4)
82
-
83
- "START n0=node(3) MATCH (n0)--(x) RETURN x"
84
- start n = node(3)
85
- match n <=> :x
86
- ret :x
87
-
88
- "START n0=node(3) MATCH (n0)--(v0) RETURN v0"
89
- x = node
90
- n = node(3)
91
- match n <=> x
92
- ret x
93
-
94
- "START n0=node(3) MATCH (n0)--(v0) RETURN v0.name"
95
- x = node
96
- n = node(3)
97
- match n <=> x
98
- ret x[:name]
99
-
100
- "START n0=node(1) RETURN n0.name AS SomethingTotallyDifferent"
101
- x = node(1)
102
- x[:name].as('SomethingTotallyDifferent')
103
-
104
- "START n0=node:fooindex_exact(name:A) RETURN n0"
105
- query(FooIndex, "name:A")
106
-
107
- "START n0=node:fooindex_fulltext(desc="A") RETURN n0"
108
- lookup(FooIndex, "desc", "A")
109
-
110
- "START n0=node(1),n1=node(2) RETURN n0,n1"
111
- [node(1), node(2)]
112
-
113
- "START n0=node(3) MATCH (n0)-->(c)-->(d) RETURN c"
114
- node(3) >> node(:c) >> :d
115
- :c
116
-
117
- "START n0=node(3) MATCH (n0)-[r]->(x) RETURN r"
118
- node(3) > :r > :x
119
- :r
120
-
121
- "START n0=node(3) MATCH (n0)-[r:friends]->(x) RETURN r"
122
- r = rel('r:friends').as(:r)
123
- node(3) > r > :x
124
- r
125
-
126
- "START n0=node(3,1) WHERE n0.age < 30 RETURN n0"
127
- n=node(3, 1)
128
- where n[:age] < 30
129
- ret n
130
-
131
- "START n0=node(3,4) WHERE n0.desc = "hej" RETURN n0"
132
- n=node(3, 4)
133
- n[:desc] == "hej"
134
- n
135
-
136
- "START n0=node(3) MATCH (n0)<-[:knows]-(c) RETURN c"
137
- a=node(3)
138
- a < ':knows' < :c
139
- :c
140
-
141
- "START n0=node(3) MATCH (n0)-[r]->(v1) WHERE type(r) =~ /K.*/ RETURN r"
142
- n=node(3)
143
- n > (r=rel('r')) > node
144
- r.rel_type =~ /K.*/
145
- r
146
-
147
- "START n0=node(3) MATCH m2 = (n0)-->(b) RETURN b,length(m2)"
148
- p = node(3) >> :b; [:b, p.length]
149
-
150
- "START n0=node(1) MATCH (n0)-->(b) RETURN distinct n0"
151
- n=node(1); n>>:b; n.distinct
152
-
153
- "START n0=node(2) MATCH (n0)-->(x) RETURN n0,count(*)"
154
- n = node(2))>>:x
155
- [n, count]
156
-
157
- "START n0=node(2,3,4) RETURN sum(n0.property)"
158
- n=node(2, 3, 4)
159
- n[:property].sum
160
-
161
- "START n0=node(2) MATCH (n0)-->(b) RETURN count(distinct n0.eyes)"
162
- n=node(2); n>>:b
163
- n[:eyes].distinct.count
164
-
165
- "START n0=node(3,4,5) RETURN ID(n0)"
166
- node(3, 4, 5).neo_id
167
-
168
- "START n0=node(2) WHERE any(x in n0.array WHERE x = "one") RETURN n0"
169
- a = node(2)
170
- a[:array].any? { |x| x == 'one' }
171
- a
172
-
173
- "START n0=node(3),n1=node(4),n2=node(1) MATCH m4 = (n0)-->(n1)-->(n2) RETURN extract(x in nodes(m4) : x.age)"
174
- a=node(3)
175
- b=node(4)
176
- c=node(1)
177
- p=a>>b>>c
178
- p.nodes.extract { |x| x[:age] }
179
-
180
- "START n0=node(3) WHERE abs(n0.x) = 3 RETURN n0"
181
- a=node(3); a[:x].abs==3
182
- a
183
-
184
- "START n0=node(3,4,5,1,2) RETURN n0 ORDER BY n0.name SKIP 1 LIMIT 2"
185
- a=node(3,4,5,1,2); ret(a).asc(a[:name]).skip(1).limit(2)
186
- # o same as
187
- a=node(3,4,5,1,2); ret a, :asc => a[:name], :skip => 1, :limit => 2
188
-
189
- For more examples, see the RSpecs
190
-
191
- == Creates Your Own Wrapper
192
-
193
- Todo, see {Neo4j::Core::Wrapper}
194
-
195
-
196
- == Changes
197
-
198
- Changes from the neo4j.rb
199
- * Use of YARD instead of RDoc
200
- * Some tidy up of the API and code (e.g. Neo4j::Node#rels methods)
201
- * Change of Ruby module structure.
202
- * More RSpecs and more use of mocking combined with real testing of the Java layer
203
- * Make sure that we retrieve relationships and nodes lazy if possible.
204
- * Cypher Query DSL
23
+ == Not Impemented Yet
205
24
 
25
+ Neo4j::Node#outgoing, #incoming, #both methods
data/lib/neo4j-core.rb CHANGED
@@ -1,11 +1,4 @@
1
1
  require 'java'
2
- include Java
3
-
4
- module Neo4j
5
- # Enumerator has been moved to top level in Ruby 1.9.2, make it compatible with Ruby 1.8.7
6
- Enumerator = Enumerable::Enumerator unless defined? Enumerator
7
- end
8
-
9
2
  require 'neo4j/config'
10
3
 
11
4
  require 'neo4j-community'
@@ -19,7 +12,6 @@ require 'neo4j-core/database'
19
12
  require 'neo4j-core/to_java'
20
13
 
21
14
  require 'neo4j-core/property/property'
22
- require 'neo4j-core/property/java'
23
15
 
24
16
  require 'neo4j-core/rels/rels'
25
17
  require 'neo4j-core/rels/traverser'
@@ -37,13 +29,9 @@ require 'neo4j-core/index/indexer_registry'
37
29
  require 'neo4j-core/index/index_config'
38
30
  require 'neo4j-core/index/indexer'
39
31
  require 'neo4j-core/index/lucene_query'
40
- require 'neo4j-core/index/unique_factory'
41
32
 
42
33
  require 'neo4j-core/equal/equal'
43
34
 
44
- require 'neo4j-core/wrapper/class_methods'
45
- require 'neo4j-core/wrapper/wrapper'
46
-
47
35
  require 'neo4j-core/relationship/relationship'
48
36
  require 'neo4j-core/relationship/class_methods'
49
37
 
@@ -52,6 +40,8 @@ require 'neo4j-core/node/class_methods'
52
40
 
53
41
  require 'neo4j/transaction'
54
42
 
43
+ require 'neo4j-core/type_converters/type_converters'
44
+
55
45
  require 'neo4j-core/traversal/evaluator'
56
46
  require 'neo4j-core/traversal/filter_predicate'
57
47
  require 'neo4j-core/traversal/prune_evaluator'
@@ -59,11 +49,5 @@ require 'neo4j-core/traversal/rel_expander'
59
49
  require 'neo4j-core/traversal/traversal'
60
50
  require 'neo4j-core/traversal/traverser'
61
51
 
62
- require 'neo4j-core/cypher/cypher'
63
- require 'neo4j-core/cypher/result_wrapper'
64
- require 'neo4j-core/hash_with_indifferent_access'
65
-
66
- require 'neo4j/algo'
67
- require 'neo4j/cypher'
68
52
  require 'neo4j/node'
69
- require 'neo4j/relationship'
53
+ require 'neo4j/relationship'
@@ -53,10 +53,10 @@ module Neo4j
53
53
  start_readonly_graph_db
54
54
  elsif Neo4j::Config['ha.db']
55
55
  start_ha_graph_db
56
- Neo4j.migrate! if Neo4j.respond_to?(:migrate!)
56
+ Neo4j.migrate!
57
57
  else
58
58
  start_local_graph_db
59
- Neo4j.migrate! if Neo4j.respond_to?(:migrate!)
59
+ Neo4j.migrate!
60
60
  end
61
61
  rescue
62
62
  @running = false
@@ -67,8 +67,7 @@ module Neo4j
67
67
  end
68
68
 
69
69
 
70
- # true if the database has started
71
- def running?
70
+ def running? #:nodoc:
72
71
  @running
73
72
  end
74
73
 
@@ -164,6 +163,8 @@ module Neo4j
164
163
  Neo4j.logger.info "starting Neo4j in HA mode, machine id: #{Neo4j.config['ha.server_id']} at #{Neo4j.config['ha.server']} db #{@storage_path}"
165
164
  # Modify the public base classes for the HA Node and Relationships
166
165
  # (instead of private Java::OrgNeo4jKernel::HighlyAvailableGraphDatabase::LookupNode)
166
+ Neo4j::Node.extend_java_class(Java::OrgNeo4jToolingWrap::WrappedNode)
167
+ Neo4j::Relationship.extend_java_class(Java::OrgNeo4jToolingWrap::WrappedRelationship)
167
168
  @graph = Java::OrgNeo4jKernel::HighlyAvailableGraphDatabase.new(@storage_path, Neo4j.config.to_java_map)
168
169
  @graph.register_transaction_event_handler(@event_handler)
169
170
  @lucene = @graph.index
@@ -88,7 +88,7 @@ module Neo4j
88
88
  # You only need to implement the methods that you need.
89
89
  #
90
90
  class EventHandler
91
- include Java::OrgNeo4jGraphdbEvent::TransactionEventHandler
91
+ include org.neo4j.graphdb.event.TransactionEventHandler
92
92
 
93
93
  def initialize
94
94
  @listeners = []
@@ -7,6 +7,7 @@ module Neo4j
7
7
  attr_reader :_indexer
8
8
 
9
9
 
10
+ # TODO fix YARD docs update using DSL
10
11
  # Sets which indexer should be used for the given node class.
11
12
  # You can share an indexer between several different classes.
12
13
  #
@@ -19,18 +20,49 @@ module Neo4j
19
20
  # node_indexer do
20
21
  # index_names :exact => 'myindex_exact', :fulltext => 'myindex_fulltext'
21
22
  # trigger_on :ntype => 'foo', :name => ['bar', 'foobar']
22
- #
23
+ # # TODO multitenancy support
23
24
  # prefix_index_name do
24
- # "Foo" # this is used for example in multitenancy to let each domain have there own index files
25
+ # return "" unless Neo4j.running?
26
+ # return "" unless @indexer_for.respond_to?(:ref_node_for_class)
27
+ # ref_node = @indexer_for.ref_node_for_class.wrapper
28
+ # prefix = ref_node.send(:_index_prefix) if ref_node.respond_to?(:_index_prefix)
29
+ # prefix ||= ref_node[:name] # To maintain backward compatiblity
30
+ # prefix.blank? ? "" : prefix + "_"
31
+ # end
32
+ #
33
+ #
34
+ # TODO ...
35
+ # numeric do
36
+ # type = decl_props && decl_props[field.to_sym] && decl_props[field.to_sym][:type]
37
+ # type && !type.is_a?(String)
25
38
  # end
26
39
  # end
27
40
  # end
28
41
  #
29
- # @param [Neo4j::Core::Index::IndexConfig] config the configuration used as context for the config_dsl
42
+ # @example Using Neo4j::NodeMixin
43
+ #
44
+ # class Contact
45
+ # include Neo4j::NodeMixin
46
+ # index :name
47
+ # has_one :phone
48
+ # end
49
+ #
50
+ # class Phone
51
+ # include Neo4j::NodeMixin
52
+ # property :phone
53
+ # node_indexer Contact # put index on the Contact class instead
54
+ # index :phone
55
+ # end
56
+ #
57
+ # # Find an contact with a phone number, this works since they share the same index
58
+ # Contact.find('phone: 12345').first #=> a phone object !
59
+ #
30
60
  # @return [Neo4j::Core::Index::Indexer] The indexer that should be used to index the given class
31
61
  # @see Neo4j::Core::Index::IndexConfig for possible configuration values in the +config_dsl+ block
32
62
  # @yield evaluated in the a Neo4j::Core::Index::IndexConfig object to configure it.
33
- def node_indexer(config = _config || IndexConfig.new(:node), &config_dsl)
63
+ def node_indexer(&config_dsl)
64
+ # TODO reuse an existing index config
65
+ config = IndexConfig.new(:node)
34
66
  config.instance_eval(&config_dsl)
35
67
  indexer(config)
36
68
  end
@@ -38,32 +70,17 @@ module Neo4j
38
70
  # Sets which indexer should be used for the given relationship class
39
71
  # Same as #node_indexer except that it indexes relationships instead of nodes.
40
72
  #
41
- # @param (see #node_indexer)
42
- # @return (see #node_indexer)
43
- def rel_indexer(config = _config || IndexConfig.new(:rel), &config_dsl)
44
- config.instance_eval(&config_dsl)
45
- indexer(config)
73
+ # @see #node_indexer
74
+ # @return [Neo4j::Core::Index::Indexer] The indexer that should be used to index the given class
75
+ def rel_indexer(clazz)
76
+ indexer(clazz, :rel)
46
77
  end
47
78
 
48
- def _config
49
- @_indexer && @_indexer.config
50
- end
51
79
 
52
80
  def indexer(index_config)
53
81
  @_indexer ||= IndexerRegistry.instance.register(Indexer.new(index_config))
54
82
  end
55
83
 
56
- # You can specify which nodes should be triggered.
57
- # The index can be triggered by one or more properties having one or more values.
58
- # This can also be done using the #node_indexer or #rel_indexer methods.
59
- #
60
- # @example trigger on property :type being 'MyType1'
61
- # Neo4j::NodeIndex.trigger_on(:type => 'MyType1')
62
- #
63
- def trigger_on(hash)
64
- _config.trigger_on(hash)
65
- end
66
-
67
84
 
68
85
  class << self
69
86
  private
@@ -76,7 +93,7 @@ module Neo4j
76
93
  def delegate(method_name)
77
94
  class_eval(<<-EOM, __FILE__, __LINE__)
78
95
  def #{method_name}(*args, &block)
79
- _indexer.send(:#{method_name}, *args, &block)
96
+ @_indexer.send(:#{method_name}, *args, &block)
80
97
  end
81
98
  EOM
82
99
  end
@@ -92,9 +109,6 @@ module Neo4j
92
109
  delegate :add_index
93
110
  delegate :rm_index
94
111
  delegate :index_type
95
- delegate :index_name_for_type
96
- delegate :index_for_type
97
- delegate :put_if_absent
98
112
  end
99
113
 
100
114
 
@@ -2,7 +2,7 @@ module Neo4j
2
2
  module Core
3
3
 
4
4
  # A mixin which adds indexing behaviour to your own Ruby class
5
- # You are expected to implement the method `_java_entity` returning the underlying Neo4j Node or Relationship.
5
+ # You are expected to implement the method `wrapped_entity` returning the underlying Neo4j Node or Relationship
6
6
  module Index
7
7
 
8
8
  # Adds an index on the given property
@@ -16,7 +16,8 @@ module Neo4j
16
16
  # @see Neo4j::Core::Index::ClassMethods#add_index
17
17
  #
18
18
  def add_index(field, value=self[field])
19
- self.class.add_index(_java_entity, field.to_s, value)
19
+ converted_value = Neo4j::TypeConverters.convert(value, field, self.class)
20
+ self.class.add_index(wrapped_entity, field.to_s, converted_value)
20
21
  end
21
22
 
22
23
  # Removes an index on the given property.
@@ -26,7 +27,7 @@ module Neo4j
26
27
  # @see Neo4j::Core::Index::ClassMethods#rm_index
27
28
  #
28
29
  def rm_index(field, value=self[field])
29
- self.class.rm_index(_java_entity, field.to_s, value)
30
+ self.class.rm_index(wrapped_entity, field.to_s, value)
30
31
  end
31
32
 
32
33
  end