blob: 9e67e09611769ea6dc954a51fa073c3c9f296812 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package main
import (
"database/sql"
"fmt"
"github.com/apache/age/drivers/golang/age"
)
// Do cypher query to AGE with database/sql Tx API transaction control
func doWithSqlAPI(dsn string, graphName string) {
// Connect to PostgreSQL
db, err := sql.Open("postgres", dsn)
if err != nil {
panic(err)
}
// Confirm graph_path created
_, err = age.GetReady(db, graphName)
if err != nil {
panic(err)
}
// Tx begin for execute create vertex
tx, err := db.Begin()
if err != nil {
panic(err)
}
// Create vertices with Cypher
_, err = age.ExecCypher(tx, graphName, 0, "CREATE (n:Person {name: '%s', weight:%f})", "Joe", 67.3)
if err != nil {
panic(err)
}
_, err = age.ExecCypher(tx, graphName, 0, "CREATE (n:Person {name: '%s', weight:77.3, roles:['Dev','marketing']})", "Jack")
if err != nil {
panic(err)
}
_, err = age.ExecCypher(tx, graphName, 0, "CREATE (n:Person {name: '%s', weight:%d})", "Andy", 59)
if err != nil {
panic(err)
}
// Commit Tx
tx.Commit()
// Tx begin for queries
tx, err = db.Begin()
if err != nil {
panic(err)
}
// Query cypher
cypherCursor, err := age.ExecCypher(tx, graphName, 1, "MATCH (n:Person) RETURN n")
if err != nil {
panic(err)
}
// Unmarshal result data to Vertex row by row
for cypherCursor.Next() {
row, err := cypherCursor.GetRow()
if err != nil {
panic(err)
}
vertex := row[0].(*age.Vertex)
fmt.Println(vertex.Id(), vertex.Label(), vertex.Props())
}
// Create Paths (Edges)
_, err = age.ExecCypher(tx, graphName, 0, "MATCH (a:Person), (b:Person) WHERE a.name='%s' AND b.name='%s' CREATE (a)-[r:workWith {weight: %d}]->(b)", "Jack", "Joe", 3)
if err != nil {
panic(err)
}
_, err = age.ExecCypher(tx, graphName, 0, "MATCH (a:Person {name: '%s'}), (b:Person {name: '%s'}) CREATE (a)-[r:workWith {weight: %d}]->(b)", "Joe", "Andy", 7)
if err != nil {
panic(err)
}
tx.Commit()
tx, err = db.Begin()
if err != nil {
panic(err)
}
// Query Paths with Cypher
cypherCursor, err = age.ExecCypher(tx, graphName, 1, "MATCH p=()-[:workWith]-() RETURN p")
if err != nil {
panic(err)
}
for cypherCursor.Next() {
row, err := cypherCursor.GetRow()
if err != nil {
panic(err)
}
path := row[0].(*age.Path)
vertexStart := path.GetAsVertex(0)
edge := path.GetAsEdge(1)
vertexEnd := path.GetAsVertex(2)
fmt.Println(vertexStart, edge, vertexEnd)
}
// Query with return many columns
cursor, err := age.ExecCypher(tx, graphName, 3, "MATCH (a:Person)-[l:workWith]-(b:Person) RETURN a, l, b")
if err != nil {
panic(err)
}
count := 0
for cursor.Next() {
row, err := cursor.GetRow()
if err != nil {
panic(err)
}
count++
v1 := row[0].(*age.Vertex)
edge := row[1].(*age.Edge)
v2 := row[2].(*age.Vertex)
fmt.Println("ROW ", count, ">>", "\n\t", v1, "\n\t", edge, "\n\t", v2)
}
// Delete Vertices
_, err = age.ExecCypher(tx, graphName, 0, "MATCH (n:Person) DETACH DELETE n RETURN *")
if err != nil {
panic(err)
}
tx.Commit()
}