package main
import (
"github.com/hypermodeinc/modus/sdk/go/pkg/neo4j"
)
const host = "my-database"
func CreatePeopleAndRelationships() (string, error) {
people := []map[string]any{
{"name": "Alice", "age": 42, "friends": []string{"Bob", "Peter", "Anna"}},
{"name": "Bob", "age": 19},
{"name": "Peter", "age": 50},
{"name": "Anna", "age": 30},
}
for _, person := range people {
_, err := neo4j.ExecuteQuery(host,
"MERGE (p:Person {name: $person.name, age: $person.age})",
map[string]any{"person": person})
if err != nil {
return "", err
}
}
for _, person := range people {
if person["friends"] != "" {
_, err := neo4j.ExecuteQuery(host, `
MATCH (p:Person {name: $person.name})
UNWIND $person.friends AS friend_name
MATCH (friend:Person {name: friend_name})
MERGE (p)-[:KNOWS]->(friend)
`, map[string]any{
"person": person,
})
if err != nil {
return "", err
}
}
}
return "People and relationships created successfully", nil
}
type Person struct {
Name string `json:"name"`
Age int64 `json:"age"`
}
func GetAliceFriendsUnder40() ([]Person, error) {
response, err := neo4j.ExecuteQuery(host, `
MATCH (p:Person {name: $name})-[:KNOWS]-(friend:Person)
WHERE friend.age < $age
RETURN friend
`,
map[string]any{
"name": "Alice",
"age": 40,
},
neo4j.WithDbName("neo4j"),
)
if err != nil {
return nil, err
}
nodeRecords := make([]Person, len(response.Records))
for i, record := range response.Records {
node, _ := neo4j.GetRecordValue[neo4j.Node](record, "friend")
name, err := neo4j.GetProperty[string](&node, "name")
if err != nil {
return nil, err
}
age, err := neo4j.GetProperty[int64](&node, "age")
if err != nil {
return nil, err
}
nodeRecords[i] = Person{
Name: name,
Age: age,
}
}
return nodeRecords, nil
}