maehara-n commented on issue #1455:
URL: https://github.com/apache/age/issues/1455#issuecomment-1926282265
@jrgemignani The code for "myapp" is just importing and using
"github.com/apache/age/drivers/golang/age".
The driver is referencing the parser.
"myapp" project is structured as follows:
```
myapp
age_wrapper_sample.go
main.go
sql_api_sample.go
go.mod
go.sum
```
main.go
```
package main
import (
"fmt"
_ "github.com/lib/pq"
)
// var dsn string = "host={host} port={port} dbname={dbname} user={username}
password={password} sslmode=disable"
var dsn string = "host=127.0.0.1 port=5432 dbname=postgres user=postgres
password=agens sslmode=disable"
// var graphName string = "{graph_path}"
var graphName string = "testGraph"
func main() {
// Do cypher query to AGE with database/sql Tx API transaction control
fmt.Println("# Do cypher query with SQL API")
doWithSqlAPI(dsn, graphName)
// Do cypher query to AGE with Age API
fmt.Println("# Do cypher query with Age API")
doWithAgeWrapper(dsn, graphName)
}
```
sql_api_sample.go
```
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()
}
```
age_wrapper_sample.go
```
package main
import (
"fmt"
"github.com/apache/age/drivers/golang/age"
)
// Do cypher query to AGE with Age API
func doWithAgeWrapper(dsn string, graphName string) {
ag, err := age.ConnectAge(graphName, dsn)
if err != nil {
panic(err)
}
tx, err := ag.Begin()
if err != nil {
panic(err)
}
_, err = tx.ExecCypher(0, "CREATE (n:Person {name: '%s'})", "Joe")
if err != nil {
panic(err)
}
_, err = tx.ExecCypher(0, "CREATE (n:Person {name: '%s', age: %d})",
"Smith", 10)
if err != nil {
panic(err)
}
_, err = tx.ExecCypher(0, "CREATE (n:Person {name: '%s', weight:%f})",
"Jack", 70.3)
if err != nil {
panic(err)
}
tx.Commit()
tx, err = ag.Begin()
if err != nil {
panic(err)
}
cursor, err := tx.ExecCypher(1, "MATCH (n:Person) RETURN n")
if err != nil {
panic(err)
}
count := 0
for cursor.Next() {
entities, err := cursor.GetRow()
if err != nil {
panic(err)
}
count++
vertex := entities[0].(*age.Vertex)
fmt.Println(count, "]", vertex.Id(), vertex.Label(),
vertex.Props())
}
fmt.Println("Vertex Count:", count)
_, err = tx.ExecCypher(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 = tx.ExecCypher(0, "MATCH (a:Person {name: '%s'}), (b:Person
{name: '%s'}) CREATE (a)-[r:workWith {weight: %d}]->(b)",
"Joe", "Smith", 7)
if err != nil {
panic(err)
}
tx.Commit()
tx, err = ag.Begin()
if err != nil {
panic(err)
}
cursor, err = tx.ExecCypher(1, "MATCH p=()-[:workWith]-() RETURN p")
if err != nil {
panic(err)
}
count = 0
for cursor.Next() {
entities, err := cursor.GetRow()
if err != nil {
panic(err)
}
count++
path := entities[0].(*age.Path)
vertexStart := path.GetAsVertex(0)
edge := path.GetAsEdge(1)
vertexEnd := path.GetAsVertex(2)
fmt.Println(count, "]", vertexStart, edge.Props(), vertexEnd)
}
// Query with return many columns
cursor, err = tx.ExecCypher(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)
}
_, err = tx.ExecCypher(0, "MATCH (n:Person) DETACH DELETE n RETURN *")
if err != nil {
panic(err)
}
tx.Commit()
}
```
If I describe go.mod as follows, the build will fail.
```
module myapp
go 1.21.5
require (
github.com/apache/age/drivers/golang v0.0.0-20240131202942-03a22b5269ec
github.com/lib/pq v1.10.9
)
require (
github.com/antlr/antlr4/runtime/Go/antlr/v4
v4.0.0-20230321174746-8dcc6526cfb1 // indirect
golang.org/x/exp v0.0.0-20240119083558-1b970713d09a // indirect
)
```
If I describe go.mod as follows, the build will succeed.
```
module myapp
go 1.21.5
require (
github.com/apache/age/drivers/golang v0.0.0-20230125234102-2a233e3e2da9
github.com/lib/pq v1.10.9
)
require github.com/antlr/antlr4/runtime/Go/antlr
v0.0.0-20210521184019-c5ad59b459ec // indirect
```
--
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
To unsubscribe, e-mail: [email protected]
For queries about this service, please contact Infrastructure at:
[email protected]