architect4r 0.3.2
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/.gitignore +4 -0
- data/Gemfile +4 -0
- data/Gemfile.lock +53 -0
- data/Guardfile +10 -0
- data/License +20 -0
- data/README.md +62 -0
- data/Rakefile +40 -0
- data/ReleaseNotes.md +33 -0
- data/Roadmap.md +31 -0
- data/Specs.md +21 -0
- data/architect4r.gemspec +31 -0
- data/lib/architect4r.rb +66 -0
- data/lib/architect4r/adapters/carrier_wave.rb +64 -0
- data/lib/architect4r/core/configuration.rb +148 -0
- data/lib/architect4r/core/cypher_methods.rb +47 -0
- data/lib/architect4r/core/management_methods.rb +129 -0
- data/lib/architect4r/core/node_methods.rb +73 -0
- data/lib/architect4r/core/relationship_methods.rb +82 -0
- data/lib/architect4r/generic_node.rb +7 -0
- data/lib/architect4r/has_node.rb +80 -0
- data/lib/architect4r/instance_manager.rb +47 -0
- data/lib/architect4r/model/callbacks.rb +19 -0
- data/lib/architect4r/model/connection.rb +29 -0
- data/lib/architect4r/model/links_query_interface.rb +23 -0
- data/lib/architect4r/model/node.rb +117 -0
- data/lib/architect4r/model/persistency.rb +95 -0
- data/lib/architect4r/model/properties.rb +166 -0
- data/lib/architect4r/model/queries.rb +38 -0
- data/lib/architect4r/model/relationship.rb +105 -0
- data/lib/architect4r/model/relationships.rb +16 -0
- data/lib/architect4r/model/validations.rb +11 -0
- data/lib/architect4r/server.rb +96 -0
- data/lib/architect4r/version.rb +3 -0
- data/spec/architect4r_spec.rb +9 -0
- data/spec/core/configuration_spec.rb +54 -0
- data/spec/core/cypher_methods_spec.rb +29 -0
- data/spec/core/node_methods_spec.rb +47 -0
- data/spec/core/relationship_methods_spec.rb +92 -0
- data/spec/fixtures/architect4r.yml +21 -0
- data/spec/fixtures/graph.db.default/active_tx_log +1 -0
- data/spec/fixtures/graph.db.default/index/lucene-store.db +0 -0
- data/spec/fixtures/graph.db.default/index/lucene.log.1 +0 -0
- data/spec/fixtures/graph.db.default/index/lucene.log.active +0 -0
- data/spec/fixtures/graph.db.default/index/lucene.log.v0 +0 -0
- data/spec/fixtures/graph.db.default/index/lucene.log.v1 +0 -0
- data/spec/fixtures/graph.db.default/index/lucene.log.v2 +0 -0
- data/spec/fixtures/graph.db.default/lock +0 -0
- data/spec/fixtures/graph.db.default/messages.log +183 -0
- data/spec/fixtures/graph.db.default/neostore +0 -0
- data/spec/fixtures/graph.db.default/neostore.id +0 -0
- data/spec/fixtures/graph.db.default/neostore.nodestore.db +0 -0
- data/spec/fixtures/graph.db.default/neostore.nodestore.db.id +0 -0
- data/spec/fixtures/graph.db.default/neostore.propertystore.db +0 -0
- data/spec/fixtures/graph.db.default/neostore.propertystore.db.arrays +0 -0
- data/spec/fixtures/graph.db.default/neostore.propertystore.db.arrays.id +0 -0
- data/spec/fixtures/graph.db.default/neostore.propertystore.db.id +0 -0
- data/spec/fixtures/graph.db.default/neostore.propertystore.db.index +0 -0
- data/spec/fixtures/graph.db.default/neostore.propertystore.db.index.id +0 -0
- data/spec/fixtures/graph.db.default/neostore.propertystore.db.index.keys +0 -0
- data/spec/fixtures/graph.db.default/neostore.propertystore.db.index.keys.id +0 -0
- data/spec/fixtures/graph.db.default/neostore.propertystore.db.strings +0 -0
- data/spec/fixtures/graph.db.default/neostore.propertystore.db.strings.id +0 -0
- data/spec/fixtures/graph.db.default/neostore.relationshipstore.db +0 -0
- data/spec/fixtures/graph.db.default/neostore.relationshipstore.db.id +0 -0
- data/spec/fixtures/graph.db.default/neostore.relationshiptypestore.db +0 -0
- data/spec/fixtures/graph.db.default/neostore.relationshiptypestore.db.id +0 -0
- data/spec/fixtures/graph.db.default/neostore.relationshiptypestore.db.names +0 -0
- data/spec/fixtures/graph.db.default/neostore.relationshiptypestore.db.names.id +0 -0
- data/spec/fixtures/graph.db.default/nioneo_logical.log.1 +0 -0
- data/spec/fixtures/graph.db.default/nioneo_logical.log.active +0 -0
- data/spec/fixtures/graph.db.default/tm_tx_log.1 +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/active_tx_log +1 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/messages.log +142 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.id +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.nodestore.db +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.nodestore.db.id +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.arrays +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.arrays.id +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.id +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.index +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.index.id +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.index.keys +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.index.keys.id +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.strings +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.propertystore.db.strings.id +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.relationshipstore.db +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.relationshipstore.db.id +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.relationshiptypestore.db +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.relationshiptypestore.db.id +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.relationshiptypestore.db.names +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/neostore.relationshiptypestore.db.names.id +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/nioneo_logical.log.active +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/nioneo_logical.log.v0 +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/nioneo_logical.log.v1 +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/nioneo_logical.log.v2 +0 -0
- data/spec/fixtures/graph.db.default/upgrade_backup/tm_tx_log.1 +0 -0
- data/spec/has_node_spec.rb +87 -0
- data/spec/model/links_query_interface_spec.rb +22 -0
- data/spec/model/links_spec.rb +26 -0
- data/spec/model/node_spec.rb +48 -0
- data/spec/model/persistency_spec.rb +98 -0
- data/spec/model/properties_spec.rb +165 -0
- data/spec/model/queries_spec.rb +50 -0
- data/spec/model/relationship_spec.rb +63 -0
- data/spec/model/validations_spec.rb +31 -0
- data/spec/server_spec.rb +33 -0
- data/spec/spec_helper.rb +115 -0
- metadata +377 -0
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
module Architect4r #:nodoc:
|
|
2
|
+
module Core #:nodoc:
|
|
3
|
+
|
|
4
|
+
# Architect4r can be configured by creating a config/architect4r file
|
|
5
|
+
# and provide environment specific data.
|
|
6
|
+
#
|
|
7
|
+
# Thanks to the sunspot-rails gem team, as this class is heavily inspired by their work!
|
|
8
|
+
#
|
|
9
|
+
# development:
|
|
10
|
+
# host: localhost
|
|
11
|
+
# port: 7474
|
|
12
|
+
# log_level: DEBUG
|
|
13
|
+
# test:
|
|
14
|
+
# host: localhost
|
|
15
|
+
# port: 7474
|
|
16
|
+
# log_level: OFF
|
|
17
|
+
# production:
|
|
18
|
+
# host: localhost
|
|
19
|
+
# port: 8080
|
|
20
|
+
# path: /my_neo_instance
|
|
21
|
+
# log_level: WARNING
|
|
22
|
+
#
|
|
23
|
+
class Configuration
|
|
24
|
+
|
|
25
|
+
def initialize(options = {})
|
|
26
|
+
options ||= {}
|
|
27
|
+
@environment = options.delete(:environment).to_s if options.has_key?(:environment)
|
|
28
|
+
self.custom_configuration = options.delete(:config) if options.has_key?(:config)
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def environment
|
|
32
|
+
@environment ||= 'development'
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
def host
|
|
36
|
+
unless defined?(@hostname)
|
|
37
|
+
@hostname = neo4j_url.host if neo4j_url
|
|
38
|
+
@hostname ||= custom_configuration_from_key('host')
|
|
39
|
+
@hostname ||= default_hostname
|
|
40
|
+
end
|
|
41
|
+
@hostname
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
def port
|
|
45
|
+
unless defined?(@port)
|
|
46
|
+
@port = neo4j_url.port if neo4j_url
|
|
47
|
+
@port ||= custom_configuration_from_key('port')
|
|
48
|
+
@port ||= default_port
|
|
49
|
+
@port = @port.to_i
|
|
50
|
+
end
|
|
51
|
+
@port
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
def path
|
|
55
|
+
unless defined?(@path)
|
|
56
|
+
@path = neo4j_url.path if neo4j_url
|
|
57
|
+
@path ||= custom_configuration_from_key('path')
|
|
58
|
+
@path ||= default_path
|
|
59
|
+
end
|
|
60
|
+
@path
|
|
61
|
+
end
|
|
62
|
+
|
|
63
|
+
def log_level
|
|
64
|
+
@log_level ||= (custom_configuration_from_key('log_level') || default_log_level)
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def log_file
|
|
68
|
+
@log_file ||= (custom_configuration_from_key('log_file') || default_log_file_location )
|
|
69
|
+
end
|
|
70
|
+
|
|
71
|
+
|
|
72
|
+
private
|
|
73
|
+
|
|
74
|
+
def default_log_file_location
|
|
75
|
+
File.join(Dir.pwd, 'log', "architect4r.#{self.environment}.log")
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
def custom_configuration_from_key( *keys )
|
|
79
|
+
keys.inject(custom_configuration) do |hash, key|
|
|
80
|
+
hash[key] if hash
|
|
81
|
+
end
|
|
82
|
+
end
|
|
83
|
+
|
|
84
|
+
def custom_configuration=(input)
|
|
85
|
+
@custom_configuration = if input.is_a?(Hash)
|
|
86
|
+
input.stringify_keys
|
|
87
|
+
elsif input.is_a?(String)
|
|
88
|
+
begin
|
|
89
|
+
if File.exist?(input)
|
|
90
|
+
File.open(input) do |file|
|
|
91
|
+
YAML.load(file)[self.environment]
|
|
92
|
+
end
|
|
93
|
+
else
|
|
94
|
+
{}
|
|
95
|
+
end
|
|
96
|
+
end
|
|
97
|
+
else
|
|
98
|
+
{}
|
|
99
|
+
end
|
|
100
|
+
end
|
|
101
|
+
|
|
102
|
+
def custom_configuration
|
|
103
|
+
@custom_configuration ||=
|
|
104
|
+
begin
|
|
105
|
+
path = File.join(Dir.pwd, 'config', 'architect4r.yml')
|
|
106
|
+
if File.exist?(path)
|
|
107
|
+
File.open(path) do |file|
|
|
108
|
+
YAML.load(file)[self.environment]
|
|
109
|
+
end
|
|
110
|
+
else
|
|
111
|
+
{}
|
|
112
|
+
end
|
|
113
|
+
end
|
|
114
|
+
end
|
|
115
|
+
|
|
116
|
+
protected
|
|
117
|
+
|
|
118
|
+
# Allow the user to configure the server by providing an environment variable
|
|
119
|
+
# with a valid url to the neo4j rest endpoint.
|
|
120
|
+
def neo4j_url
|
|
121
|
+
URI.parse(ENV['NEO4J_URL']) if ENV['NEO4J_URL']
|
|
122
|
+
end
|
|
123
|
+
|
|
124
|
+
def default_hostname
|
|
125
|
+
'localhost'
|
|
126
|
+
end
|
|
127
|
+
|
|
128
|
+
def default_port
|
|
129
|
+
{ 'test' => 7475,
|
|
130
|
+
'development' => 7474,
|
|
131
|
+
'production' => 7474
|
|
132
|
+
}[self.environment] || 7474
|
|
133
|
+
end
|
|
134
|
+
|
|
135
|
+
def default_path
|
|
136
|
+
''
|
|
137
|
+
end
|
|
138
|
+
|
|
139
|
+
def default_log_level
|
|
140
|
+
{ 'test' => 'OFF',
|
|
141
|
+
'development' => 'INFO',
|
|
142
|
+
'production' => 'WARNING'
|
|
143
|
+
}[self.environment] || 'INFO'
|
|
144
|
+
end
|
|
145
|
+
|
|
146
|
+
end
|
|
147
|
+
end
|
|
148
|
+
end
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
module Architect4r
|
|
2
|
+
module Core
|
|
3
|
+
module CypherMethods
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
|
|
6
|
+
module InstanceMethods
|
|
7
|
+
|
|
8
|
+
def execute_cypher(query)
|
|
9
|
+
url = prepend_base_url("/ext/CypherPlugin/graphdb/execute_query")
|
|
10
|
+
response = Typhoeus::Request.post(url,
|
|
11
|
+
:headers => { 'Accept' => 'application/json', 'Content-Type' => 'application/json' },
|
|
12
|
+
:body => { 'query' => query }.to_json)
|
|
13
|
+
|
|
14
|
+
# Check if there might be an error with the query
|
|
15
|
+
if response.code == 400
|
|
16
|
+
raise Architect4r::InvalidCypherQuery.new(query)
|
|
17
|
+
elsif response.code == 500
|
|
18
|
+
msg = JSON.parse(response.body)
|
|
19
|
+
|
|
20
|
+
if msg['exception'].to_s.match /org.neo4j.graphdb.NotFoundException/
|
|
21
|
+
nil
|
|
22
|
+
else
|
|
23
|
+
raise Architect4r::InvalidCypherQuery.new(query)
|
|
24
|
+
end
|
|
25
|
+
elsif response.code == 204
|
|
26
|
+
nil
|
|
27
|
+
else
|
|
28
|
+
result_data = JSON.parse(response.body)
|
|
29
|
+
|
|
30
|
+
# Convert the columnized result array to hashes within an array
|
|
31
|
+
results = []
|
|
32
|
+
|
|
33
|
+
result_data['data'].each_with_index do |row, ri|
|
|
34
|
+
result_row = {}
|
|
35
|
+
result_data['columns'].each_with_index do |column, ci|
|
|
36
|
+
result_row[column] = convert_if_possible(row[ci])
|
|
37
|
+
end
|
|
38
|
+
results << result_row
|
|
39
|
+
end
|
|
40
|
+
results
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
@@ -0,0 +1,129 @@
|
|
|
1
|
+
module Architect4r
|
|
2
|
+
module Core
|
|
3
|
+
module ManagementMethods
|
|
4
|
+
|
|
5
|
+
def get_kernel_data
|
|
6
|
+
#http://localhost:7475/db/manage/server/jmx/domain/org.neo4j/
|
|
7
|
+
end
|
|
8
|
+
|
|
9
|
+
# Deletes the database
|
|
10
|
+
def reset_database!
|
|
11
|
+
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
=begin
|
|
19
|
+
{
|
|
20
|
+
"beans" : [ {
|
|
21
|
+
"description" : "Estimates of the numbers of different kinds of Neo4j primitives",
|
|
22
|
+
"name" : "org.neo4j:instance=kernel#0,name=Primitive count",
|
|
23
|
+
"attributes" : [ {
|
|
24
|
+
"description" : "An estimation of the number of nodes used in this Neo4j instance",
|
|
25
|
+
"name" : "NumberOfNodeIdsInUse",
|
|
26
|
+
"value" : 109,
|
|
27
|
+
"isReadable" : "true",
|
|
28
|
+
"type" : "long",
|
|
29
|
+
"isWriteable" : "false ",
|
|
30
|
+
"isIs" : "false "
|
|
31
|
+
}, {
|
|
32
|
+
"description" : "An estimation of the number of relationships used in this Neo4j instance",
|
|
33
|
+
"name" : "NumberOfRelationshipIdsInUse",
|
|
34
|
+
"value" : 0,
|
|
35
|
+
"isReadable" : "true",
|
|
36
|
+
"type" : "long",
|
|
37
|
+
"isWriteable" : "false ",
|
|
38
|
+
"isIs" : "false "
|
|
39
|
+
}, {
|
|
40
|
+
"description" : "An estimation of the number of properties used in this Neo4j instance",
|
|
41
|
+
"name" : "NumberOfPropertyIdsInUse",
|
|
42
|
+
"value" : 295,
|
|
43
|
+
"isReadable" : "true",
|
|
44
|
+
"type" : "long",
|
|
45
|
+
"isWriteable" : "false ",
|
|
46
|
+
"isIs" : "false "
|
|
47
|
+
}, {
|
|
48
|
+
"description" : "The number of relationship types used in this Neo4j instance",
|
|
49
|
+
"name" : "NumberOfRelationshipTypeIdsInUse",
|
|
50
|
+
"value" : 0,
|
|
51
|
+
"isReadable" : "true",
|
|
52
|
+
"type" : "long",
|
|
53
|
+
"isWriteable" : "false ",
|
|
54
|
+
"isIs" : "false "
|
|
55
|
+
} ],
|
|
56
|
+
"url" : "org.neo4j/instance%3Dkernel%230%2Cname%3DPrimitive+count"
|
|
57
|
+
}, {
|
|
58
|
+
"description" : "Information about the Neo4j kernel",
|
|
59
|
+
"name" : "org.neo4j:instance=kernel#0,name=Kernel",
|
|
60
|
+
"attributes" : [ {
|
|
61
|
+
"description" : "Whether this is a read only instance",
|
|
62
|
+
"name" : "ReadOnly",
|
|
63
|
+
"value" : false,
|
|
64
|
+
"isReadable" : "true",
|
|
65
|
+
"type" : "boolean",
|
|
66
|
+
"isWriteable" : "false ",
|
|
67
|
+
"isIs" : "true"
|
|
68
|
+
}, {
|
|
69
|
+
"description" : "An ObjectName that can be used as a query for getting all management beans for this Neo4j instance.",
|
|
70
|
+
"name" : "MBeanQuery",
|
|
71
|
+
"value" : "org.neo4j:instance=kernel#0,name=*",
|
|
72
|
+
"isReadable" : "true",
|
|
73
|
+
"type" : "javax.management.ObjectName",
|
|
74
|
+
"isWriteable" : "false ",
|
|
75
|
+
"isIs" : "false "
|
|
76
|
+
}, {
|
|
77
|
+
"description" : "The time from which this Neo4j instance was in operational mode.",
|
|
78
|
+
"name" : "KernelStartTime",
|
|
79
|
+
"value" : "Sat Sep 10 17:42:53 CEST 2011",
|
|
80
|
+
"isReadable" : "true",
|
|
81
|
+
"type" : "java.util.Date",
|
|
82
|
+
"isWriteable" : "false ",
|
|
83
|
+
"isIs" : "false "
|
|
84
|
+
}, {
|
|
85
|
+
"description" : "The time when this Neo4j graph store was created.",
|
|
86
|
+
"name" : "StoreCreationDate",
|
|
87
|
+
"value" : "Sat Sep 03 20:19:29 CEST 2011",
|
|
88
|
+
"isReadable" : "true",
|
|
89
|
+
"type" : "java.util.Date",
|
|
90
|
+
"isWriteable" : "false ",
|
|
91
|
+
"isIs" : "false "
|
|
92
|
+
}, {
|
|
93
|
+
"description" : "An identifier that uniquely identifies this Neo4j graph store.",
|
|
94
|
+
"name" : "StoreId",
|
|
95
|
+
"value" : "a75e32d2bd11e487",
|
|
96
|
+
"isReadable" : "true",
|
|
97
|
+
"type" : "java.lang.String",
|
|
98
|
+
"isWriteable" : "false ",
|
|
99
|
+
"isIs" : "false "
|
|
100
|
+
}, {
|
|
101
|
+
"description" : "The current version of the Neo4j store logical log.",
|
|
102
|
+
"name" : "StoreLogVersion",
|
|
103
|
+
"value" : 2,
|
|
104
|
+
"isReadable" : "true",
|
|
105
|
+
"type" : "long",
|
|
106
|
+
"isWriteable" : "false ",
|
|
107
|
+
"isIs" : "false "
|
|
108
|
+
}, {
|
|
109
|
+
"description" : "The version of Neo4j",
|
|
110
|
+
"name" : "KernelVersion",
|
|
111
|
+
"value" : "Neo4j - Graph Database Kernel 1.4.1",
|
|
112
|
+
"isReadable" : "true",
|
|
113
|
+
"type" : "java.lang.String",
|
|
114
|
+
"isWriteable" : "false ",
|
|
115
|
+
"isIs" : "false "
|
|
116
|
+
}, {
|
|
117
|
+
"description" : "The location where the Neo4j store is located",
|
|
118
|
+
"name" : "StoreDirectory",
|
|
119
|
+
"value" : "/Users/namxam/packages/neo4j-community-1.4.1.test/data/graph.db",
|
|
120
|
+
"isReadable" : "true",
|
|
121
|
+
"type" : "java.lang.String",
|
|
122
|
+
"isWriteable" : "false ",
|
|
123
|
+
"isIs" : "false "
|
|
124
|
+
} ],
|
|
125
|
+
"url" : "org.neo4j/instance%3Dkernel%230%2Cname%3DKernel"
|
|
126
|
+
} ],
|
|
127
|
+
"domain" : "org.neo4j"
|
|
128
|
+
}
|
|
129
|
+
=end
|
|
@@ -0,0 +1,73 @@
|
|
|
1
|
+
module Architect4r
|
|
2
|
+
module Core
|
|
3
|
+
module NodeMethods
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
|
|
6
|
+
module InstanceMethods
|
|
7
|
+
|
|
8
|
+
def create_node(properties)
|
|
9
|
+
# Send request
|
|
10
|
+
response = Typhoeus::Request.post(prepend_base_url('/node'),
|
|
11
|
+
:headers => { 'Accept' => 'application/json', 'Content-Type' => 'application/json' },
|
|
12
|
+
:body => properties.to_json)
|
|
13
|
+
|
|
14
|
+
# Evaluate response
|
|
15
|
+
response.code == 201 ? JSON.parse(response.body) : nil
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
def get_node(id)
|
|
19
|
+
# Example response for a node
|
|
20
|
+
# extensions: {}
|
|
21
|
+
#
|
|
22
|
+
# paged_traverse: http://localhost:7475/db/data/node/0/paged/traverse/{returnType}{?pageSize,leaseTime}
|
|
23
|
+
# self: http://localhost:7475/db/data/node/0
|
|
24
|
+
# property: http://localhost:7475/db/data/node/0/properties/{key}
|
|
25
|
+
# data: {}
|
|
26
|
+
#
|
|
27
|
+
# incoming_typed_relationships: http://localhost:7475/db/data/node/0/relationships/in/{-list|&|types}
|
|
28
|
+
# outgoing_typed_relationships: http://localhost:7475/db/data/node/0/relationships/out/{-list|&|types}
|
|
29
|
+
# incoming_relationships: http://localhost:7475/db/data/node/0/relationships/in
|
|
30
|
+
# all_relationships: http://localhost:7475/db/data/node/0/relationships/all
|
|
31
|
+
# create_relationship: http://localhost:7475/db/data/node/0/relationships
|
|
32
|
+
# traverse: http://localhost:7475/db/data/node/0/traverse/{returnType}
|
|
33
|
+
# properties: http://localhost:7475/db/data/node/0/properties
|
|
34
|
+
# all_typed_relationships: http://localhost:7475/db/data/node/0/relationships/all/{-list|&|types}
|
|
35
|
+
# outgoing_relationships: http://localhost:7475/db/data/node/0/relationships/out
|
|
36
|
+
|
|
37
|
+
# Handle cases where id might be a url
|
|
38
|
+
|
|
39
|
+
response = Typhoeus::Request.get(node_url(id), :headers => { 'Accept' => 'application/json' })
|
|
40
|
+
response.code == 200 ? JSON.parse(response.body) : nil
|
|
41
|
+
end
|
|
42
|
+
|
|
43
|
+
def update_node(id, properties)
|
|
44
|
+
# Handle urls
|
|
45
|
+
url = id.to_i == 0 ? id : node_url(id)
|
|
46
|
+
|
|
47
|
+
# Append the properties
|
|
48
|
+
url += "/properties"
|
|
49
|
+
|
|
50
|
+
response = Typhoeus::Request.put(url,
|
|
51
|
+
:headers => { 'Accept' => 'application/json', 'Content-Type' => 'application/json' },
|
|
52
|
+
:body => properties.to_json)
|
|
53
|
+
response.code == 204 ? true : false
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
def delete_node(id)
|
|
57
|
+
# Delete all relationships
|
|
58
|
+
get_node_relationships(id, :all).each do |rel|
|
|
59
|
+
delete_relationship(rel)
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
# Delete node itself
|
|
63
|
+
response = Typhoeus::Request.delete(node_url(id), :headers => { 'Accept' => 'application/json' })
|
|
64
|
+
response.code == 204 ? true : false
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
def root
|
|
68
|
+
get_node(get('/')['reference_node'])
|
|
69
|
+
end
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
module Architect4r
|
|
2
|
+
module Core
|
|
3
|
+
module RelationshipMethods
|
|
4
|
+
extend ActiveSupport::Concern
|
|
5
|
+
|
|
6
|
+
module InstanceMethods
|
|
7
|
+
|
|
8
|
+
def create_relationship(start_node, end_node, type, properties={})
|
|
9
|
+
# POST http://localhost:7474/db/data/node/3/relationships
|
|
10
|
+
# {"to" : "http://localhost:7474/db/data/node/4", "type" : "LOVES"}
|
|
11
|
+
# 201: Created
|
|
12
|
+
# Location: http://localhost:7474/db/data/relationship/2
|
|
13
|
+
|
|
14
|
+
# Add the destination node and type to the properties
|
|
15
|
+
properties = { 'to' => node_url(end_node), 'type' => type.to_s, 'data' => properties }
|
|
16
|
+
|
|
17
|
+
# Send request
|
|
18
|
+
response = Typhoeus::Request.post(node_url(start_node) + "/relationships",
|
|
19
|
+
:headers => { 'Accept' => 'application/json', 'Content-Type' => 'application/json' },
|
|
20
|
+
:body => properties.to_json)
|
|
21
|
+
|
|
22
|
+
# Evaluate response
|
|
23
|
+
response.code == 201 ? JSON.parse(response.body) : nil
|
|
24
|
+
end
|
|
25
|
+
|
|
26
|
+
def get_relationship(relationship)
|
|
27
|
+
response = Typhoeus::Request.get(relationship_url(relationship), :headers => { 'Accept' => 'application/json' })
|
|
28
|
+
response.code == 200 ? JSON.parse(response.body) : nil
|
|
29
|
+
end
|
|
30
|
+
|
|
31
|
+
def delete_relationship(relationship)
|
|
32
|
+
response = Typhoeus::Request.delete(relationship_url(relationship), :headers => { 'Accept' => 'application/json' })
|
|
33
|
+
response.code == 204 ? true : false
|
|
34
|
+
end
|
|
35
|
+
|
|
36
|
+
def get_node_relationships(node, direction = :all, *types)
|
|
37
|
+
# GET http://localhost:7474/db/data/node/6/relationships/all
|
|
38
|
+
# GET http://localhost:7474/db/data/node/11/relationships/in
|
|
39
|
+
# GET http://localhost:7474/db/data/node/16/relationships/out
|
|
40
|
+
# GET http://localhost:7474/db/data/node/21/relationships/all/LIKES&HATES
|
|
41
|
+
# 200: OK
|
|
42
|
+
|
|
43
|
+
# Set direction
|
|
44
|
+
direction = case direction.to_s
|
|
45
|
+
when 'incoming'
|
|
46
|
+
'in'
|
|
47
|
+
when 'outgoing'
|
|
48
|
+
'out'
|
|
49
|
+
else
|
|
50
|
+
'all'
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
# Create typ filter
|
|
54
|
+
types = types.map { |e| URI.escape(e) }.join('&')
|
|
55
|
+
|
|
56
|
+
# Send request
|
|
57
|
+
url = node_url(node) + "/relationships/#{direction}/#{types}"
|
|
58
|
+
response = Typhoeus::Request.get(url, :headers => { 'Accept' => 'application/json' })
|
|
59
|
+
response.code == 200 ? JSON.parse(response.body) : []
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
def update_relationship(id, properties)
|
|
63
|
+
# PUT http://localhost:7474/db/data/relationship/0/properties
|
|
64
|
+
# 204: No Content
|
|
65
|
+
url = relationship_url(id) + '/properties'
|
|
66
|
+
response = Typhoeus::Request.put(url,
|
|
67
|
+
:headers => { 'Accept' => 'application/json', 'Content-Type' => 'application/json' },
|
|
68
|
+
:body => properties.to_json)
|
|
69
|
+
response.code == 204 ? true : false
|
|
70
|
+
end
|
|
71
|
+
|
|
72
|
+
def get_relationship_types
|
|
73
|
+
# GET http://localhost:7474/db/data/relationship/types
|
|
74
|
+
# 200: OK
|
|
75
|
+
response = Typhoeus::Request.get(prepend_base_url('/relationship/types'), :headers => { 'Accept' => 'application/json' })
|
|
76
|
+
response.code == 200 ? JSON.parse(response.body) : []
|
|
77
|
+
end
|
|
78
|
+
|
|
79
|
+
end
|
|
80
|
+
end
|
|
81
|
+
end
|
|
82
|
+
end
|