-
Notifications
You must be signed in to change notification settings - Fork 80
/
cypher_relationship.rb
131 lines (106 loc) · 3.23 KB
/
cypher_relationship.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
module Neo4j::Server
class CypherRelationship < Neo4j::Relationship
include Neo4j::Server::Resource
include Neo4j::Core::CypherTranslator
include Neo4j::Core::ActiveEntity
def initialize(session, value)
@session = session
@response_hash = value
@rel_type = @response_hash['type']
@props = @response_hash['data']
@start_node_neo_id = @response_hash['start'].match(/\d+$/)[0].to_i
@end_node_neo_id = @response_hash['end'].match(/\d+$/)[0].to_i
@id = @response_hash['id']
end
def ==(o)
o.class == self.class && o.neo_id == neo_id
end
alias_method :eql?, :==
def id
@id
end
def neo_id
id
end
def inspect
"CypherRelationship #{neo_id}"
end
def load_resource
if resource_data.nil? || resource_data.empty?
@resource_data = @session._query_or_fail("#{match_start} RETURN n", true, neo_id: neo_id) # r.first_data
end
end
def start_node_neo_id
@start_node_neo_id
end
def end_node_neo_id
@end_node_neo_id
end
def _start_node_id
@start_node_neo_id ||= get_node_id(:start)
end
def _end_node_id
@end_node_neo_id ||= get_node_id(:end)
end
def _start_node
@_start_node ||= Neo4j::Node._load(start_node_neo_id)
end
def _end_node
load_resource
@_end_node ||= Neo4j::Node._load(end_node_neo_id)
end
def get_node_id(direction)
load_resource
resource_url_id(resource_url(direction))
end
def get_property(key)
@session._query_or_fail("#{match_start} RETURN n.`#{key}`", true, neo_id: neo_id )
end
def set_property(key,value)
@session._query_or_fail("#{match_start} SET n.`#{key}` = {value}", false, { value: value, neo_id: neo_id })
end
def remove_property(key)
@session._query_or_fail("#{match_start} REMOVE n.`#{key}`", false, neo_id: neo_id)
end
# (see Neo4j::Relationship#props)
def props
if @props
@props
else
hash = @session._query_entity_data("#{match_start} RETURN n", nil, neo_id: neo_id)
@props = Hash[hash['data'].map{ |k, v| [k.to_sym, v] }]
end
end
# (see Neo4j::Relationship#props=)
def props=(properties)
@session._query_or_fail("#{match_start} SET n = { props }", false, { props: properties, neo_id: neo_id })
properties
end
# (see Neo4j::Relationship#update_props)
def update_props(properties)
return if properties.empty?
q = "#{match_start} SET " + properties.keys.map do |k|
"n.`#{k}`= #{escape_value(properties[k])}"
end.join(',')
@session._query_or_fail(q, false, neo_id: neo_id)
properties
end
def rel_type
@rel_type.to_sym
end
def del
@session._query("#{match_start} DELETE n", neo_id: neo_id).raise_unless_response_code(200)
end
alias_method :delete, :del
alias_method :destroy, :del
def exist?
response = @session._query("#{match_start} RETURN n", neo_id: neo_id)
# binding.pry
(response.data.nil? || response.data.empty?) ? false : true
end
private
def match_start(identifier = 'n')
"MATCH (node)-[#{identifier}]-() WHERE ID(#{identifier}) = {neo_id}"
end
end
end