neo4j-core 3.0.0.alpha.1
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/Gemfile +22 -0
- data/README.md +332 -0
- data/lib/neo4j-core.rb +27 -0
- data/lib/neo4j-core/cypher_translator.rb +34 -0
- data/lib/neo4j-core/hash_with_indifferent_access.rb +165 -0
- data/lib/neo4j-core/helpers.rb +25 -0
- data/lib/neo4j-core/label.rb +8 -0
- data/lib/neo4j-core/version.rb +5 -0
- data/lib/neo4j-embedded.rb +18 -0
- data/lib/neo4j-embedded/embedded_database.rb +29 -0
- data/lib/neo4j-embedded/embedded_label.rb +80 -0
- data/lib/neo4j-embedded/embedded_node.rb +163 -0
- data/lib/neo4j-embedded/embedded_relationship.rb +44 -0
- data/lib/neo4j-embedded/embedded_session.rb +151 -0
- data/lib/neo4j-embedded/property.rb +43 -0
- data/lib/neo4j-embedded/to_java.rb +49 -0
- data/lib/neo4j-server.rb +10 -0
- data/lib/neo4j-server/cypher_label.rb +28 -0
- data/lib/neo4j-server/cypher_node.rb +140 -0
- data/lib/neo4j-server/cypher_node_uncommited.rb +12 -0
- data/lib/neo4j-server/cypher_relationship.rb +82 -0
- data/lib/neo4j-server/cypher_response.rb +113 -0
- data/lib/neo4j-server/cypher_session.rb +156 -0
- data/lib/neo4j-server/cypher_transaction.rb +81 -0
- data/lib/neo4j-server/resource.rb +73 -0
- data/lib/neo4j/entity_equality.rb +9 -0
- data/lib/neo4j/jars/concurrentlinkedhashmap-lru-1.3.1.jar +0 -0
- data/lib/neo4j/jars/geronimo-jta_1.1_spec-1.1.1.jar +0 -0
- data/lib/neo4j/jars/lucene-core-3.6.2.jar +0 -0
- data/lib/neo4j/jars/neo4j-cypher-2.0.0-M06.jar +0 -0
- data/lib/neo4j/jars/neo4j-kernel-2.0-SNAPSHOT-tests.jar +0 -0
- data/lib/neo4j/jars/neo4j-kernel-2.0.0-M06.jar +0 -0
- data/lib/neo4j/jars/neo4j-lucene-index-2.0.0-M06.jar +0 -0
- data/lib/neo4j/jars/neo4j-management-2.0.0-M06.jar +0 -0
- data/lib/neo4j/jars/org.apache.servicemix.bundles.jline-0.9.94_1.jar +0 -0
- data/lib/neo4j/jars/parboiled-core-1.1.6.jar +0 -0
- data/lib/neo4j/jars/parboiled-scala_2.10-1.1.6.jar +0 -0
- data/lib/neo4j/jars/scala-library-2.10.2.jar +0 -0
- data/lib/neo4j/label.rb +88 -0
- data/lib/neo4j/node.rb +185 -0
- data/lib/neo4j/property_container.rb +22 -0
- data/lib/neo4j/property_validator.rb +23 -0
- data/lib/neo4j/relationship.rb +84 -0
- data/lib/neo4j/session.rb +124 -0
- data/lib/neo4j/tasks/neo4j_server.rb +131 -0
- data/lib/neo4j/transaction.rb +52 -0
- data/neo4j-core.gemspec +35 -0
- metadata +144 -0
@@ -0,0 +1,22 @@
|
|
1
|
+
module Neo4j
|
2
|
+
module PropertyContainer
|
3
|
+
include Neo4j::PropertyValidator
|
4
|
+
|
5
|
+
# Returns the Neo4j Property of given key
|
6
|
+
def [](key)
|
7
|
+
get_property(key)
|
8
|
+
end
|
9
|
+
|
10
|
+
|
11
|
+
# Sets the neo4j property
|
12
|
+
def []=(key,value)
|
13
|
+
validate_property(value)
|
14
|
+
|
15
|
+
if value.nil?
|
16
|
+
remove_property(key)
|
17
|
+
else
|
18
|
+
set_property(key,value)
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,23 @@
|
|
1
|
+
module Neo4j
|
2
|
+
module PropertyValidator
|
3
|
+
|
4
|
+
class InvalidPropertyException < Exception
|
5
|
+
|
6
|
+
end
|
7
|
+
|
8
|
+
# the valid values on a property, and arrays of those.
|
9
|
+
VALID_PROPERTY_VALUE_CLASSES = Set.new([Array, NilClass, String, Float, TrueClass, FalseClass, Fixnum])
|
10
|
+
|
11
|
+
# @param [Object] value the value we want to check if it's a valid neo4j property value
|
12
|
+
# @return [True, False] A false means it can't be persisted.
|
13
|
+
def valid_property?(value)
|
14
|
+
VALID_PROPERTY_VALUE_CLASSES.include?(value.class)
|
15
|
+
end
|
16
|
+
|
17
|
+
def validate_property(value)
|
18
|
+
unless valid_property?(value)
|
19
|
+
raise Neo4j::PropertyValidator::InvalidPropertyException.new("Not valid Neo4j Property value #{value.class}, valid: #{Neo4j::Node::VALID_PROPERTY_VALUE_CLASSES.to_a.join(', ')}")
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
@@ -0,0 +1,84 @@
|
|
1
|
+
module Neo4j
|
2
|
+
# A relationship between two nodes in the graph. A relationship has a start node, an end node and a type.
|
3
|
+
# You can attach properties to relationships like Neo4j::Node.
|
4
|
+
#
|
5
|
+
# The fact that the relationship API gives meaning to start and end nodes implicitly means that all relationships have a direction.
|
6
|
+
# In the example above, rel would be directed from node to otherNode.
|
7
|
+
# 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:
|
8
|
+
#
|
9
|
+
# Furthermore, Neo4j guarantees that a relationship is never "hanging freely,"
|
10
|
+
# i.e. start_node, end_node and other_node are guaranteed to always return valid, non-nil nodes.
|
11
|
+
class Relationship
|
12
|
+
|
13
|
+
include PropertyContainer
|
14
|
+
include EntityEquality
|
15
|
+
|
16
|
+
# @abstract
|
17
|
+
def start_node
|
18
|
+
raise 'not implemented'
|
19
|
+
end
|
20
|
+
|
21
|
+
# @abstract
|
22
|
+
def end_node
|
23
|
+
raise 'not implemented'
|
24
|
+
end
|
25
|
+
|
26
|
+
# @abstract
|
27
|
+
def del
|
28
|
+
raise 'not implemented'
|
29
|
+
end
|
30
|
+
|
31
|
+
# The unique neo4j id
|
32
|
+
# @abstract
|
33
|
+
def neo_id
|
34
|
+
raise 'not implemented'
|
35
|
+
end
|
36
|
+
|
37
|
+
# @return [true, false] if the relationship exists
|
38
|
+
# @abstract
|
39
|
+
def exist?
|
40
|
+
raise 'not implemented'
|
41
|
+
end
|
42
|
+
|
43
|
+
# Returns the relationship name
|
44
|
+
#
|
45
|
+
# @example
|
46
|
+
# a = Neo4j::Node.new
|
47
|
+
# a.create_rel(:friends, node_b)
|
48
|
+
# a.rels.first.rel_type # => :friends
|
49
|
+
# @return [Symbol] the type of the relationship
|
50
|
+
def rel_type
|
51
|
+
raise 'not implemented'
|
52
|
+
end
|
53
|
+
|
54
|
+
# A convenience operation that, given a node that is attached to this relationship, returns the other node.
|
55
|
+
# For example if node is a start node, the end node will be returned, and vice versa.
|
56
|
+
# This is a very convenient operation when you're manually traversing the node space by invoking one of the #rels
|
57
|
+
# method on a node. For example, to get the node "at the other end" of a relationship, use the following:
|
58
|
+
#
|
59
|
+
# @example
|
60
|
+
# end_node = node.rels.first.other_node(node)
|
61
|
+
#
|
62
|
+
# @raise This operation will throw a runtime exception if node is neither this relationship's start node nor its end node.
|
63
|
+
#
|
64
|
+
# @param [Neo4j::Node] node the node that we don't want to return
|
65
|
+
# @return [Neo4j::Node] the other node wrapper
|
66
|
+
# @see #_other_node
|
67
|
+
def other_node(node)
|
68
|
+
if node == start_node
|
69
|
+
return end_node
|
70
|
+
elsif node == end_node
|
71
|
+
return start_node
|
72
|
+
else
|
73
|
+
raise "Node #{node.inspect} is neither start nor end node"
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
class << self
|
78
|
+
def load(neo_id, session = Neo4j::Session.current)
|
79
|
+
session.load_relationship(neo_id)
|
80
|
+
end
|
81
|
+
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
@@ -0,0 +1,124 @@
|
|
1
|
+
module Neo4j
|
2
|
+
class Session
|
3
|
+
|
4
|
+
@@current_session = nil
|
5
|
+
@@factories = {}
|
6
|
+
|
7
|
+
# @abstract
|
8
|
+
def close
|
9
|
+
self.class.unregister(self)
|
10
|
+
end
|
11
|
+
|
12
|
+
# Only for embedded database
|
13
|
+
# @abstract
|
14
|
+
def start
|
15
|
+
raise "not impl."
|
16
|
+
end
|
17
|
+
|
18
|
+
# Only for embedded database
|
19
|
+
# @abstract
|
20
|
+
def shutdown
|
21
|
+
raise "not impl."
|
22
|
+
end
|
23
|
+
|
24
|
+
# Only for embedded database
|
25
|
+
# @abstract
|
26
|
+
def running
|
27
|
+
raise "not impl."
|
28
|
+
end
|
29
|
+
|
30
|
+
def auto_commit?
|
31
|
+
true # TODO
|
32
|
+
end
|
33
|
+
|
34
|
+
# @abstract
|
35
|
+
def begin_tx
|
36
|
+
raise "not impl."
|
37
|
+
end
|
38
|
+
|
39
|
+
class CypherError < StandardError
|
40
|
+
attr_reader :error_msg, :error_status, :error_code
|
41
|
+
def initialize(error_msg, error_code, error_status)
|
42
|
+
super(error_msg)
|
43
|
+
@error_msg = error_msg
|
44
|
+
@error_status = error_status
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
# Executes a Cypher Query
|
49
|
+
# Returns an enumerable of hash values, column => value
|
50
|
+
#
|
51
|
+
# @example Using the Cypher DSL
|
52
|
+
# q = Neo4j.query("START n=node({param}) RETURN n", :param => 0)
|
53
|
+
# q.first[:n] #=> the node
|
54
|
+
# q.columns.first => :n
|
55
|
+
#
|
56
|
+
# @example Using the Cypher DSL
|
57
|
+
# q = Neo4j.query{ match node(3) <=> node(:x); ret :x}
|
58
|
+
# q.first[:n] #=> the @node
|
59
|
+
# q.columns.first => :n
|
60
|
+
#
|
61
|
+
# @example Using the Cypher DSL and one parameter (n=Neo4j.ref_node)
|
62
|
+
# q = Neo4j.query(Neo4j.ref_node){|n| n <=> node(:x); :x}
|
63
|
+
# q.first[:n] #=> the @node
|
64
|
+
# q.columns.first => :n
|
65
|
+
#
|
66
|
+
# @example Using an array of nodes
|
67
|
+
# # same as - two_nodes=node(Neo4j.ref_node.neo_id, node_b.neo_id), b = node(b.neo_id)
|
68
|
+
# q = Neo4j.query([Neo4j.ref_node, node_b], node_c){|two_nodes, b| two_nodes <=> b; b}
|
69
|
+
#
|
70
|
+
# @see Cypher
|
71
|
+
# @see http://docs.neo4j.org/chunked/milestone/cypher-query-lang.html The Cypher Query Language Documentation
|
72
|
+
# @note Returns a read-once only forward iterable.
|
73
|
+
# @param params parameter for the query_dsl block
|
74
|
+
# @return [Neo4j::Cypher::ResultWrapper] a forward read once only Enumerable, containing hash values.
|
75
|
+
#
|
76
|
+
# @abstract
|
77
|
+
def query(*params, &query_dsl)
|
78
|
+
cypher_params = params.pop if params.last.is_a?(Hash)
|
79
|
+
q = query_dsl ? Neo4j::Cypher.query(*params, &query_dsl).to_s : params[0]
|
80
|
+
_query(q, cypher_params)
|
81
|
+
end
|
82
|
+
|
83
|
+
# Same as #query but does not accept an DSL and returns the raw result from the database.
|
84
|
+
# Notice, it might return different values depending on which database is used, embedded or server.
|
85
|
+
# @abstract
|
86
|
+
def _query(*params)
|
87
|
+
raise 'not implemented'
|
88
|
+
end
|
89
|
+
|
90
|
+
class << self
|
91
|
+
# Creates a new session
|
92
|
+
# @param db_type the type of database, e.g. :embedded_db, or :server_db
|
93
|
+
def open(db_type, *params)
|
94
|
+
unless (@@factories[db_type])
|
95
|
+
raise "Can't connect to database '#{db_type}', available #{@@factories.keys.join(',')}"
|
96
|
+
end
|
97
|
+
session = @@factories[db_type].call(*params)
|
98
|
+
register(session)
|
99
|
+
end
|
100
|
+
|
101
|
+
def current
|
102
|
+
@@current_session
|
103
|
+
end
|
104
|
+
|
105
|
+
def set_current(session)
|
106
|
+
@@current_session = session
|
107
|
+
end
|
108
|
+
|
109
|
+
def register(session)
|
110
|
+
set_current(session) unless @@current_session
|
111
|
+
@@current_session
|
112
|
+
end
|
113
|
+
|
114
|
+
def unregister(session)
|
115
|
+
@@current_session = nil if @@current_session == session
|
116
|
+
end
|
117
|
+
|
118
|
+
def register_db(db, &session_factory)
|
119
|
+
raise "Factory for #{db} already exists" if @@factories[db]
|
120
|
+
@@factories[db] = session_factory
|
121
|
+
end
|
122
|
+
end
|
123
|
+
end
|
124
|
+
end
|
@@ -0,0 +1,131 @@
|
|
1
|
+
# borrowed from architect4r
|
2
|
+
require 'os'
|
3
|
+
|
4
|
+
namespace :neo4j do
|
5
|
+
desc "Install Neo4j"
|
6
|
+
task :install, :edition, :version do |t, args|
|
7
|
+
args.with_defaults(:edition => "community", :version => "1.7")
|
8
|
+
puts "Installing Neo4j-#{args[:edition]}-#{args[:version]}"
|
9
|
+
|
10
|
+
if OS::Underlying.windows?
|
11
|
+
# Download Neo4j
|
12
|
+
unless File.exist?('neo4j.zip')
|
13
|
+
df = File.open('neo4j.zip', 'wb')
|
14
|
+
begin
|
15
|
+
df << HTTParty.get("http://dist.neo4j.org/neo4j-#{args[:edition]}-#{args[:version]}-windows.zip")
|
16
|
+
ensure
|
17
|
+
df.close()
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
# Extract and move to neo4j directory
|
22
|
+
unless File.exist?('neo4j')
|
23
|
+
Zip::ZipFile.open('neo4j.zip') do |zip_file|
|
24
|
+
zip_file.each do |f|
|
25
|
+
f_path=File.join(".", f.name)
|
26
|
+
FileUtils.mkdir_p(File.dirname(f_path))
|
27
|
+
begin
|
28
|
+
zip_file.extract(f, f_path) unless File.exist?(f_path)
|
29
|
+
rescue
|
30
|
+
puts f.name + " failed to extract."
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
FileUtils.mv "neo4j-#{args[:edition]}-#{args[:version]}", "neo4j"
|
35
|
+
end
|
36
|
+
|
37
|
+
# Install if running with Admin Privileges
|
38
|
+
if %x[reg query "HKU\\S-1-5-19"].size > 0
|
39
|
+
%x[neo4j/bin/neo4j install]
|
40
|
+
puts "Neo4j Installed as a service."
|
41
|
+
end
|
42
|
+
|
43
|
+
else
|
44
|
+
%x[wget http://dist.neo4j.org/neo4j-#{args[:edition]}-#{args[:version]}-unix.tar.gz]
|
45
|
+
%x[tar -xvzf neo4j-#{args[:edition]}-#{args[:version]}-unix.tar.gz]
|
46
|
+
%x[mv neo4j-#{args[:edition]}-#{args[:version]} neo4j]
|
47
|
+
%x[rm neo4j-#{args[:edition]}-#{args[:version]}-unix.tar.gz]
|
48
|
+
puts "Neo4j Installed in to neo4j directory."
|
49
|
+
end
|
50
|
+
puts "Type 'rake neo4j:start' to start it"
|
51
|
+
end
|
52
|
+
|
53
|
+
desc "Start the Neo4j Server"
|
54
|
+
task :start do
|
55
|
+
puts "Starting Neo4j..."
|
56
|
+
if OS::Underlying.windows?
|
57
|
+
if %x[reg query "HKU\\S-1-5-19"].size > 0
|
58
|
+
%x[neo4j/bin/Neo4j.bat start] #start service
|
59
|
+
else
|
60
|
+
puts "Starting Neo4j directly, not as a service."
|
61
|
+
%x[neo4j/bin/Neo4j.bat]
|
62
|
+
end
|
63
|
+
else
|
64
|
+
%x[neo4j/bin/neo4j start]
|
65
|
+
end
|
66
|
+
end
|
67
|
+
|
68
|
+
desc "Stop the Neo4j Server"
|
69
|
+
task :stop do
|
70
|
+
puts "Stopping Neo4j..."
|
71
|
+
if OS::Underlying.windows?
|
72
|
+
if %x[reg query "HKU\\S-1-5-19"].size > 0
|
73
|
+
%x[neo4j/bin/Neo4j.bat stop] #stop service
|
74
|
+
else
|
75
|
+
puts "You do not have administrative rights to stop the Neo4j Service"
|
76
|
+
end
|
77
|
+
else
|
78
|
+
%x[neo4j/bin/neo4j stop]
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
desc "Restart the Neo4j Server"
|
83
|
+
task :restart do
|
84
|
+
puts "Restarting Neo4j..."
|
85
|
+
if OS::Underlying.windows?
|
86
|
+
if %x[reg query "HKU\\S-1-5-19"].size > 0
|
87
|
+
%x[neo4j/bin/Neo4j.bat restart]
|
88
|
+
else
|
89
|
+
puts "You do not have administrative rights to restart the Neo4j Service"
|
90
|
+
end
|
91
|
+
else
|
92
|
+
%x[neo4j/bin/neo4j restart]
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
desc "Reset the Neo4j Server"
|
97
|
+
task :reset_yes_i_am_sure do
|
98
|
+
# Stop the server
|
99
|
+
if OS::Underlying.windows?
|
100
|
+
if %x[reg query "HKU\\S-1-5-19"].size > 0
|
101
|
+
%x[neo4j/bin/Neo4j.bat stop]
|
102
|
+
|
103
|
+
# Reset the database
|
104
|
+
FileUtils.rm_rf("neo4j/data/graph.db")
|
105
|
+
FileUtils.mkdir("neo4j/data/graph.db")
|
106
|
+
|
107
|
+
# Remove log files
|
108
|
+
FileUtils.rm_rf("neo4j/data/log")
|
109
|
+
FileUtils.mkdir("neo4j/data/log")
|
110
|
+
|
111
|
+
%x[neo4j/bin/Neo4j.bat start]
|
112
|
+
else
|
113
|
+
puts "You do not have administrative rights to reset the Neo4j Service"
|
114
|
+
end
|
115
|
+
else
|
116
|
+
%x[neo4j/bin/neo4j stop]
|
117
|
+
|
118
|
+
# Reset the database
|
119
|
+
FileUtils.rm_rf("neo4j/data/graph.db")
|
120
|
+
FileUtils.mkdir("neo4j/data/graph.db")
|
121
|
+
|
122
|
+
# Remove log files
|
123
|
+
FileUtils.rm_rf("neo4j/data/log")
|
124
|
+
FileUtils.mkdir("neo4j/data/log")
|
125
|
+
|
126
|
+
# Start the server
|
127
|
+
%x[neo4j/bin/neo4j start]
|
128
|
+
end
|
129
|
+
end
|
130
|
+
|
131
|
+
end
|
@@ -0,0 +1,52 @@
|
|
1
|
+
module Neo4j
|
2
|
+
class Transaction
|
3
|
+
def self.new(current = Session.current)
|
4
|
+
current.begin_tx
|
5
|
+
end
|
6
|
+
|
7
|
+
|
8
|
+
class << self
|
9
|
+
|
10
|
+
def run(run_in_tx=true)
|
11
|
+
raise ArgumentError.new("Expected a block to run in Transaction.run") unless block_given?
|
12
|
+
|
13
|
+
return yield(nil) unless run_in_tx
|
14
|
+
|
15
|
+
begin
|
16
|
+
tx = Neo4j::Transaction.new
|
17
|
+
ret = yield tx
|
18
|
+
tx.success
|
19
|
+
rescue Exception => e
|
20
|
+
if e.respond_to?(:cause) && e.cause
|
21
|
+
puts "Java Exception in a transaction, cause: #{e.cause}"
|
22
|
+
e.cause.print_stack_trace
|
23
|
+
end
|
24
|
+
tx.failure unless tx.nil?
|
25
|
+
raise
|
26
|
+
ensure
|
27
|
+
tx.finish unless tx.nil?
|
28
|
+
end
|
29
|
+
ret
|
30
|
+
end
|
31
|
+
|
32
|
+
def current
|
33
|
+
Thread.current[:neo4j_curr_tx]
|
34
|
+
end
|
35
|
+
|
36
|
+
def unregister(tx)
|
37
|
+
Thread.current[:neo4j_curr_tx] = nil if tx == Thread.current[:neo4j_curr_tx]
|
38
|
+
end
|
39
|
+
|
40
|
+
def register(tx)
|
41
|
+
# we don't support running more then one transaction per thread
|
42
|
+
raise "Already running a transaction" if current
|
43
|
+
Thread.current[:neo4j_curr_tx] = tx
|
44
|
+
end
|
45
|
+
|
46
|
+
def unregister_current
|
47
|
+
Thread.current[:neo4j_curr_tx] = nil
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
end
|
52
|
+
end
|
data/neo4j-core.gemspec
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
lib = File.expand_path('../lib/', __FILE__)
|
2
|
+
$:.unshift lib unless $:.include?(lib)
|
3
|
+
|
4
|
+
require 'neo4j-core/version'
|
5
|
+
|
6
|
+
Gem::Specification.new do |s|
|
7
|
+
s.name = "neo4j-core"
|
8
|
+
s.version = Neo4j::Core::VERSION
|
9
|
+
s.required_ruby_version = ">= 1.8.7"
|
10
|
+
|
11
|
+
s.authors = "Andreas Ronge"
|
12
|
+
s.email = 'andreas.ronge@gmail.com'
|
13
|
+
s.homepage = "http://github.com/andreasronge/neo4j-core/tree"
|
14
|
+
s.rubyforge_project = 'neo4j-core'
|
15
|
+
s.summary = "A graph database for JRuby"
|
16
|
+
s.description = <<-EOF
|
17
|
+
You can think of Neo4j as a high-performance graph engine with all the features of a mature and robust database.
|
18
|
+
The programmer works with an object-oriented, flexible network structure rather than with strict and static tables
|
19
|
+
yet enjoys all the benefits of a fully transactional, enterprise-strength database.
|
20
|
+
It comes included with the Apache Lucene document database.
|
21
|
+
EOF
|
22
|
+
|
23
|
+
s.require_path = 'lib'
|
24
|
+
s.files = Dir.glob("{bin,lib,config}/**/*") + %w(README.md Gemfile neo4j-core.gemspec)
|
25
|
+
s.has_rdoc = true
|
26
|
+
s.extra_rdoc_files = %w( README.md )
|
27
|
+
s.rdoc_options = ["--quiet", "--title", "Neo4j::Core", "--line-numbers", "--main", "README.rdoc", "--inline-source"]
|
28
|
+
|
29
|
+
# Not released yet
|
30
|
+
s.add_dependency("httparty")
|
31
|
+
s.add_dependency("json")
|
32
|
+
s.add_dependency("neo4j-cypher")
|
33
|
+
# s.add_dependency("neo4j-community", '>=1.9.M05', '<2.0')
|
34
|
+
# s.add_dependency("neo4j-cypher", '~> 1.0.0')
|
35
|
+
end
|