-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSample.hs
71 lines (61 loc) · 2.13 KB
/
Sample.hs
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
module Main where
import Control.Lens ( to
, (&)
, (^?!)
)
import Control.Monad
import Data.Map.Strict ( (!) )
import Data.Text ( Text
, unpack
)
import Database.Bolt hiding ( unpack )
import Database.Bolt.Extras
import Database.Bolt.Extras.Graph
import Database.Bolt.Lens hiding ( exact )
import Config
import Types
anakinQ :: Text
anakinQ =
"MATCH (anakin:Person) -[:APPEARS_IN]- (movie:Movie) \
\WHERE anakin.name = 'ANAKIN' \
\RETURN movie"
anakinGraph :: GraphGetRequest
anakinGraph =
emptyGraph
& addNode
"anakin"
(defaultNodeNotReturn & withLabelQ ''Person & withProp
("name", T "ANAKIN")
)
& addNode "movie"
(defaultNodeReturn & withLabelQ ''Movie & withReturn allProps)
& addRelation "anakin"
"movie"
(defaultRelNotReturn & withLabelQ ''APPEARS_IN)
main :: IO ()
main = do
pipe <- connect localCfg
res <- run pipe $ query anakinQ
putStrLn "All movies with Anakin"
putStrLn ""
putStrLn "Extracting wihtout lenses"
forM_ res $ \rec -> do
movie <- rec `at` "movie" >>= exact
movieName <- exact $ nodeProps movie ! "title"
putStrLn $ unpack movieName
putStrLn ""
putStrLn "Extracting with lenses"
forM_ res $ \rec -> do
let movieName = rec ^?! field "movie" . prop "title"
putStrLn $ unpack movieName
putStrLn ""
putStrLn "Extracting with TemplateHaskell"
forM_ res $ \rec -> do
let Movie movieName = rec ^?! field "movie" . to fromNode
putStrLn $ unpack movieName
putStrLn ""
putStrLn "Extracting with sub-graph query"
gres <- run pipe $ makeRequest @GetRequest [] anakinGraph
forM_ gres $ \graph -> do
let Movie movieName = extractNode "movie" graph
putStrLn $ unpack movieName