PageRenderTime 49ms CodeModel.GetById 18ms RepoModel.GetById 1ms app.codeStats 0ms

/spec/cypher_match_spec.rb

https://github.com/earllevine/neo4j-cypher
Ruby | 349 lines | 249 code | 100 blank | 0 comment | 0 complexity | f0c799ddcb9b0806e4d2588919fbacda MD5 | raw file
  1. require 'spec_helper'
  2. describe "Neo4j::Cypher" do
  3. describe 'MATCH' do
  4. describe 'match' do
  5. describe "node(3).match{|n| n <=> node(4) }" do
  6. it { Proc.new { node(3).match{|n| n <=> node(4) } }.should be_cypher("START v1=node(3),v2=node(4) MATCH (v1)--(v2) RETURN v1") }
  7. end
  8. describe "node(3).match{|n| n <=> node(4) }.match{|n| n >> node(5)}" do
  9. it { Proc.new { node(3).match{|n| n <=> node(4) }.match{|n| n >> node(5)} }.should be_cypher("START v1=node(3),v2=node(4),v3=node(5) MATCH (v1)--(v2),(v1)-->(v3) RETURN v1") }
  10. end
  11. describe "node(3).match{|n| n <=> node(:q).match{|n| n >> node(5)}}" do
  12. it { Proc.new { node(3).match{|n| n <=> node(:q).match{|n| n >> node(5)}} }.should be_cypher("START v1=node(3),v2=node(5) MATCH (q)-->(v2),(v1)--(q) RETURN v1") }
  13. end
  14. end
  15. describe "<=>" do
  16. describe "node(3) <=> :x" do
  17. it { Proc.new { node(3) <=> :x }.should be_cypher("START v1=node(3) MATCH v2 = (v1)--(x) RETURN v2") }
  18. end
  19. describe "node(3) <=> node" do
  20. it { Proc.new { node(3) <=> node }.should be_cypher("START v1=node(3) MATCH v3 = (v1)--(v2) RETURN v3") }
  21. end
  22. describe "(node(3) <=> :x).ret(:x)" do
  23. it { Proc.new { (node(3) <=> :x).ret(:x) }.should be_cypher("START v1=node(3) MATCH (v1)--(x) RETURN x") }
  24. end
  25. describe "x = node; n = node(3); match n <=> x; ret x" do
  26. it { Proc.new { x = node; n = node(3); match n <=> x; ret x }.should be_cypher("START v1=node(3) MATCH (v1)--(v2) RETURN v2") }
  27. end
  28. describe "x = node; n = node(3); match n <=> x; ret x[:name]" do
  29. it { Proc.new { x = node; n = node(3); match n <=> x; ret x[:name] }.should be_cypher("START v2=node(3) MATCH (v2)--(v1) RETURN v1.name") }
  30. end
  31. describe "node(3) <=> node(:x); :x" do
  32. it { Proc.new { node(3) <=> node(:x); :x }.should be_cypher("START v1=node(3) MATCH (v1)--(x) RETURN x") }
  33. end
  34. describe "node(3) <=> 'foo'; :foo" do
  35. it { Proc.new { node(3) <=> 'foo'; :foo }.should be_cypher("START v1=node(3) MATCH (v1)--(foo) RETURN foo") }
  36. end
  37. describe "node(1) <=> node(:other_person) > node " do
  38. it { Proc.new { (node(1).as(:x) <=> node(:other_person)) >> node(:y) }.should be_cypher("START x=node(1) MATCH v1 = (x)--(other_person)-->(y) RETURN v1")}
  39. end
  40. end
  41. describe "both" do
  42. describe "node(3).both" do
  43. it { Proc.new { node(3).both }.should be_cypher("START v1=node(3) MATCH (v1)-[?]-(v2) RETURN v2") }
  44. end
  45. describe "node(3).both(rel)" do
  46. it { Proc.new { node(3).both(rel) }.should be_cypher("START v1=node(3) MATCH (v1)-[?]-(v2) RETURN v2") }
  47. end
  48. describe "node(1).both('r:friends')" do
  49. it { Proc.new { node(1).both('r:friends') }.should be_cypher(%Q[START v1=node(1) MATCH (v1)-[r:friends]-(v2) RETURN v2]) }
  50. end
  51. describe "node(3).both(node)[:name]" do
  52. it { Proc.new { node(3).both(node)[:name] }.should be_cypher("START v2=node(3) MATCH (v2)-[?]-(v1) RETURN v1.name") }
  53. end
  54. describe "node(3).both(rel)" do
  55. it { Proc.new { node(3).both(rel) }.should be_cypher("START v1=node(3) MATCH (v1)-[?]-(v2) RETURN v2") }
  56. end
  57. describe "node(1).both(:friends)" do
  58. it { Proc.new { node(1).both(:friends) }.should be_cypher(%Q[START v1=node(1) MATCH (v1)-[:`friends`]-(v2) RETURN v2]) }
  59. end
  60. describe "node(1).both(:friends, :knows)" do
  61. it { Proc.new { node(1).both(:friends, :knows) }.should be_cypher(%Q[START v1=node(1) MATCH (v1)-[:`friends`|`knows`]-(v2) RETURN v2]) }
  62. end
  63. describe "node(1).both(rel(:friends), rel(:knows))" do
  64. it { Proc.new { node(1).both(rel(:friends), rel(:knows)) }.should be_cypher(%Q[START v1=node(1) MATCH (v1)-[:`friends`|`knows`]-(v2) RETURN v2]) }
  65. end
  66. describe "node(3).both(rel(:foo)" do
  67. it { Proc.new { node(3).both(rel(:foo)) }.should be_cypher("START v1=node(3) MATCH (v1)-[:`foo`]-(v2) RETURN v2") }
  68. end
  69. describe "node(1).both(node(:other_person))" do
  70. it { Proc.new { node(1).both(node(:other_person)) }.should be_cypher(%Q[START v1=node(1) MATCH (v1)-[?]-(other_person) RETURN other_person]) }
  71. end
  72. describe "node(1).both(node(:other_person)).both(node(:foo))" do
  73. it { Proc.new { node(1).both(node(:other_person)).both(node(:foo)) }.should be_cypher(%Q[START v1=node(1) MATCH (v1)-[?]-(other_person),(other_person)-[?]-(foo) RETURN foo]) }
  74. end
  75. describe "node(1).both(:friends, :work)" do
  76. it { Proc.new { node(1).both(:friends, :work) }.should be_cypher(%Q[START v1=node(1) MATCH (v1)-[:`friends`|`work`]-(v2) RETURN v2]) }
  77. end
  78. describe "node(1).both(:friends, :work, node(42)).both" do
  79. it { Proc.new { node(1).both(:friends, :work, node(42)).both }.should be_cypher(%Q[START v1=node(1),v2=node(42) MATCH (v1)-[:`friends`|`work`]-(v2),(v2)-[?]-(v3) RETURN v3]) }
  80. end
  81. end
  82. describe 'both?' do
  83. describe "node(1).both?" do
  84. it { Proc.new { node(1).both? }.should be_cypher(%Q[START v1=node(1) MATCH (v1)-[?]-(v2) RETURN v2]) }
  85. end
  86. describe "node(1).both?(:friends)" do
  87. it { Proc.new { node(1).both?(:friends) }.should be_cypher(%Q[START v1=node(1) MATCH (v1)-[?:`friends`]-(v2) RETURN v2]) }
  88. end
  89. describe "node(1).both?(rel(:kalle))" do
  90. it { Proc.new { node(1).both?(rel(:kalle)) }.should be_cypher(%Q[START v1=node(1) MATCH (v1)-[?:`kalle`]-(v2) RETURN v2]) }
  91. end
  92. end
  93. describe "-" do
  94. describe "node(3) - rel - node(4)" do
  95. it { Proc.new { node(3) - rel - node(4) }.should be_cypher("START v1=node(3),v2=node(4) MATCH v3 = (v1)-[?]-(v2) RETURN v3") }
  96. end
  97. describe "node(3) - :foo - node(4)" do
  98. it { Proc.new { node(3) - :foo - node(4) }.should be_cypher("START v1=node(3),v2=node(4) MATCH v3 = (v1)-[:`foo`]-(v2) RETURN v3") }
  99. end
  100. describe "node(3) - ':knows|friends' - :foo; :foo" do
  101. it { Proc.new { node(3) - ':knows|friends' - :foo; :foo }.should be_cypher("START v1=node(3) MATCH (v1)-[:knows|friends]-(foo) RETURN foo") }
  102. end
  103. describe "(node(3) << node(:c)) - ':friends' - :d; :d" do
  104. it { Proc.new { (node(3) << node(:c)) - ':friends' - :d; :d }.should be_cypher(%{START v1=node(3) MATCH (v1)<--(c)-[:friends]-(d) RETURN d}) }
  105. end
  106. describe "node(3) - ':knows' - :c; :c" do
  107. it { Proc.new { node(3) - ':knows' - :c; :c }.should be_cypher(%{START v1=node(3) MATCH (v1)-[:knows]-(c) RETURN c}) }
  108. end
  109. describe %{a = node(3); a - ':knows' - :c - ":friends" - :d; :c} do
  110. it { Proc.new { a = node(3); a - ':knows' - :c - ":friends" - :d; :c }.should be_cypher(%{START v1=node(3) MATCH (v1)-[:knows]-(c)-[:friends]-(d) RETURN c}) }
  111. end
  112. end
  113. describe "<<" do
  114. describe "node(3) << node(4)" do
  115. it { Proc.new { node(3) << node(4) }.should be_cypher(%{START v1=node(3),v2=node(4) MATCH v3 = (v1)<--(v2) RETURN v3}) }
  116. end
  117. describe "node(3) << node(:c) << :d; :c" do
  118. it { Proc.new { node(3) << node(:c) << :d; :c }.should be_cypher(%{START v1=node(3) MATCH (v1)<--(c)<--(d) RETURN c}) }
  119. end
  120. end
  121. describe 'incoming' do
  122. end
  123. describe 'incoming?' do
  124. describe "node(1).incoming?(:friends)" do
  125. it { Proc.new { node(1).incoming?(:friends) }.should be_cypher(%Q[START v1=node(1) MATCH (v1)<-[?:`friends`]-(v2) RETURN v2]) }
  126. end
  127. end
  128. describe ">>" do
  129. describe %{node(3) >> :b} do
  130. it { Proc.new { node(3) >> :b }.should be_cypher(%{START v1=node(3) MATCH v2 = (v1)-->(b) RETURN v2}) }
  131. end
  132. describe "node(3) >> node(4)" do
  133. it { Proc.new { node(3) >> node(4) }.should be_cypher(%{START v1=node(3),v2=node(4) MATCH v3 = (v1)-->(v2) RETURN v3}) }
  134. end
  135. describe "node(3) >> node(:c) >> :d; :c" do
  136. it { Proc.new { node(3) >> node(:c) >> :d; :c }.should be_cypher(%{START v1=node(3) MATCH (v1)-->(c)-->(d) RETURN c}) }
  137. end
  138. describe "node(1) <=> node(:other_person) >> node; :other_person" do
  139. it do
  140. Proc.new do
  141. (node(1) <=> node(:other_person)) >> node
  142. :other_person
  143. end.should be_cypher(%Q[START v1=node(1) MATCH (v1)--(other_person)-->(v2) RETURN other_person])
  144. end
  145. end
  146. describe "node(1) >> node(:other_person) <=> node; :other_person" do
  147. it do
  148. Proc.new do
  149. node(1) >> node(:other_person) <=> node
  150. :other_person
  151. end.should be_cypher(%Q[START v1=node(1) MATCH (v1)-->(other_person)--(v2) RETURN other_person])
  152. end
  153. end
  154. end
  155. describe 'outgoing' do
  156. describe %{node(2).outgoing.as(:q)} do
  157. it { Proc.new { node(2).outgoing.as(:q) }.should be_cypher(%{START v1=node(2) MATCH (v1)-[?]->(q) RETURN q}) }
  158. end
  159. describe "node(1).outgoing(:friends, :work, node(42)).incoming" do
  160. it { Proc.new { node(1).outgoing(:friends, :work, node(42)).incoming }.should be_cypher(%Q[START v1=node(1),v2=node(42) MATCH (v1)-[:`friends`|`work`]->(v2),(v2)<-[?]-(v3) RETURN v3]) }
  161. end
  162. end
  163. describe 'outgoing?' do
  164. describe "node(1).outgoing?(:friends)" do
  165. it { Proc.new { node(1).outgoing?(:friends) }.should be_cypher(%Q[START v1=node(1) MATCH (v1)-[?:`friends`]->(v2) RETURN v2]) }
  166. end
  167. end
  168. describe '>' do
  169. describe "node(3) > :r > :x" do
  170. it { Proc.new { node(3) > :r > :x }.should be_cypher("START v1=node(3) MATCH v2 = (v1)-[:`r`]->(x) RETURN v2") }
  171. end
  172. describe "(node(5) > :r > :middle) >> node(7)" do
  173. it { Proc.new { (node(5) > :r > :middle) >> node(7) }.should be_cypher("START v1=node(5),v2=node(7) MATCH v3 = (v1)-[:`r`]->(middle)-->(v2) RETURN v3") }
  174. end
  175. describe "node(3) > :r > node" do
  176. it { Proc.new { node(3) > :r > node }.should be_cypher("START v1=node(3) MATCH v3 = (v1)-[:`r`]->(v2) RETURN v3") }
  177. end
  178. describe "node(3) > :r > node(4)" do
  179. it { Proc.new { node(3) > :r > node(4) }.should be_cypher("START v1=node(3),v2=node(4) MATCH v3 = (v1)-[:`r`]->(v2) RETURN v3") }
  180. end
  181. describe "node(3) << node(:c) > ':friends' > :d; :d" do
  182. it { Proc.new { node(3) << node(:c) > ':friends' > :d; :d }.should be_cypher(%{START v1=node(3) MATCH (v1)<--(c)-[:friends]->(d) RETURN d}) }
  183. end
  184. describe "node(3) > 'r:friends' > :x; :r" do
  185. it { Proc.new { node(3) > 'r:friends' > :x; :r }.should be_cypher("START v1=node(3) MATCH (v1)-[r:friends]->(x) RETURN r") }
  186. end
  187. describe "node(3) > ':r' > 'bla'; :x" do
  188. it { Proc.new { node(3) > ':r' > 'bla'; :x }.should be_cypher("START v1=node(3) MATCH (v1)-[:r]->(bla) RETURN x") }
  189. end
  190. describe "node(3) > :r > node; node" do
  191. it { Proc.new { node(3) > :r > node; :r }.should be_cypher("START v1=node(3) MATCH (v1)-[:`r`]->(v2) RETURN r") }
  192. end
  193. describe "a=node(3); a > ':knows' > node(:b) > ':knows' > :c; :c" do
  194. it { Proc.new { a=node(3); a > ':knows' > node(:b) > ':knows' > :c; :c }.should be_cypher(%{START v1=node(3) MATCH (v1)-[:knows]->(b)-[:knows]->(c) RETURN c}) }
  195. end
  196. end
  197. describe '<' do
  198. describe "node(3) < :r < :x" do
  199. it { Proc.new { node(3) < :r < :x }.should be_cypher("START v1=node(3) MATCH v2 = (v1)<-[:`r`]-(x) RETURN v2") }
  200. end
  201. describe "node(3) > :r > node" do
  202. it { Proc.new { node(3) < :r < node }.should be_cypher("START v1=node(3) MATCH v3 = (v1)<-[:`r`]-(v2) RETURN v3") }
  203. end
  204. describe "node(3) > :r > node(4)" do
  205. it { Proc.new { node(3) < :r < node(4) }.should be_cypher("START v1=node(3),v2=node(4) MATCH v3 = (v1)<-[:`r`]-(v2) RETURN v3") }
  206. end
  207. describe "node(3) << node(:c) < ':friends' < :d; :d" do
  208. it { Proc.new { node(3) << node(:c) < ':friends' < :d; :d }.should be_cypher(%{START v1=node(3) MATCH (v1)<--(c)<-[:friends]-(d) RETURN d}) }
  209. end
  210. describe "a=node(3); a < ':knows' < :c; :c" do
  211. it { Proc.new { a=node(3); a < ':knows' < :c; :c }.should be_cypher(%{START v1=node(3) MATCH (v1)<-[:knows]-(c) RETURN c}) }
  212. end
  213. describe "a=node(3); a < ':knows' < node(:c) < :friends < :d" do
  214. it { Proc.new { a=node(3); a < ':knows' < node(:c) < :friends < :d }.should be_cypher(%{START v1=node(3) MATCH v2 = (v1)<-[:knows]-(c)<-[:`friends`]-(d) RETURN v2}) }
  215. end
  216. describe "a=node(3); a < ':knows' < node(:c) > :friends > :d" do
  217. it { Proc.new { a=node(3); a < ':knows' < node(:c) > :friends > :d }.should be_cypher(%{START v1=node(3) MATCH v2 = (v1)<-[:knows]-(c)-[:`friends`]->(d) RETURN v2}) }
  218. end
  219. end
  220. describe 'shortestPath' do
  221. describe %{ a, x=node(1), node(2); p = shortest_path { a > '?*' > x }; p } do
  222. it { Proc.new { a, x=node(1), node(2); p = shortest_path { a > '?*' > x }; p }.should be_cypher(%{START v1=node(1),v2=node(2) MATCH v3 = shortestPath((v1)-[?*]->(v2)) RETURN v3}) }
  223. end
  224. describe %{(node(1) > '?*' > node(2)).shortest_path} do
  225. it { Proc.new { (node(1) > '?*' > node(2)).shortest_path }.should be_cypher(%{START v1=node(1),v2=node(2) MATCH v3 = shortestPath((v1)-[?*]->(v2)) RETURN v3}) }
  226. end
  227. describe %{shortest_path{node(1) > '?*' > node(2)}} do
  228. it { Proc.new { shortest_path { node(1) > '?*' > node(2) } }.should be_cypher(%{START v1=node(1),v2=node(2) MATCH v3 = shortestPath((v1)-[?*]->(v2)) RETURN v3}) }
  229. end
  230. describe %{shortest_path { node(1) > '?*' > :x > ':friend' > node(2)}} do
  231. it { Proc.new { shortest_path { node(1) > '?*' > :x > ':friend' > node(2) } }.should be_cypher(%{START v1=node(1),v2=node(2) MATCH v3 = shortestPath((v1)-[?*]->(x)-[:friend]->(v2)) RETURN v3}) }
  232. end
  233. end
  234. describe %{a=node(3); a > ':knows' > :b > ':knows' > :c; a -':blocks' - :d -':knows' -:c; [a, :b, :c, :d] } do
  235. it { Proc.new { a=node(3); a > ':knows' > :b > ':knows' > :c; a -':blocks' - :d -':knows' -:c; [a, :b, :c, :d] }.should be_cypher(%{START v1=node(3) MATCH (v1)-[:knows]->(b)-[:knows]->(c),(v1)-[:blocks]-(d)-[:knows]-(c) RETURN v1,b,c,d}) }
  236. end
  237. end
  238. describe 'allShortestPaths' do
  239. describe %{ a, x=node(1), node(2); p = shortest_paths { a > '?*' > x }; p } do
  240. it { Proc.new { a, x=node(1), node(2); p = shortest_paths { a > '?*' > x }; p }.should be_cypher(%{START v1=node(1),v2=node(2) MATCH v3 = allShortestPaths((v1)-[?*]->(v2)) RETURN v3}) }
  241. end
  242. end
  243. describe 'length' do
  244. describe "ret(:a, :b, :c, (node(3).as(:a) > ':KNOWS*0..1' > :b).length, (node(:b) > ':BLOCKS*0..1' > :c).length)" do
  245. it { Proc.new { ret(:a, :b, :c, (node(3).as(:a) > ':KNOWS*0..1' > :b).length, (node(:b) > ':BLOCKS*0..1' > :c).length) }.should \
  246. be_cypher("START a=node(3) MATCH v1 = (a)-[:KNOWS*0..1]->(b),v2 = (b)-[:BLOCKS*0..1]->(c) RETURN a,b,c,length(v1),length(v2)")}
  247. end
  248. end
  249. end