package main import ( "database/sql" "fmt" _ "gopkg.in/cq.v1" "gopkg.in/yaml.v2" "io/ioutil" "log" ) type Config struct { Reviews map[string][]string } func main() { yamlFile := "reviews.yaml" data, err := ioutil.ReadFile(yamlFile) if err != nil { log.Fatal(err) } var config Config err = yaml.Unmarshal(data, &config) if err != nil { log.Fatal(err) } created := map[string]bool{} cmd := "" // nuke all content toNeo4j(`MATCH (n) OPTIONAL MATCH (n)-[r]-() DELETE n,r;`) for prod, reviewers := range config.Reviews { for _, rev := range reviewers { if _, ok := created[prod]; !ok { cmd += fmt.Sprintf( "MERGE (%s:Product {name:'%s'})\n", prod, prod) created[prod] = true } if _, ok := created[rev]; !ok { cmd += fmt.Sprintf( "MERGE (%s:Reviewer {name:'%s'})\n", rev, rev) created[rev] = true } cmd += fmt.Sprintf( "MERGE (%s)-[:Reviewed " + "{name: 'reviewed'}]-(%s)\n", rev, prod) } } cmd += ";" toNeo4j(cmd) } func toNeo4j(cmd string) { db, err := sql.Open("neo4j-cypher", "http://neo4j:test@localhost:7474") if err != nil { log.Fatal(err) } defer db.Close() _, err = db.Exec(cmd) if err != nil { log.Fatal(err) } }