Choose a writable local database path in your application. The next scene names it databasePath. Open the database through the binding and arrange to release its handle after its dependent queries, rows and mutations.

The complete sequence below opens storage, creates people, queries their names, and releases the handles. The next two steps explain its patch and query inputs. Run this sequence once in a fresh example database; repeating its temporary entity names creates more entities.

Store people and query their names

seedText holds this document:

dust232B
#_ada {name Ada
       role engineer
       age  36}
#_bob {name   Bob
       role   engineer
       age    41
       mentor {#link #_ada}}
#_cy  {name Cy
       role designer
       age  29}
#_tx  {author smoke
       reason seed}

queryText holds this document:

dust58B
find    [?name]
where   [[?e name ?name]]
orderBy [?name]
go678B
opened, err := stardust.Open(databasePath, stardust.Options{})
if err != nil {
	return err
}
defer opened.Close()

seed, err := stardust.Parse(seedText, stardust.DUST)
if err != nil {
	return err
}
defer seed.Close()

if _, err := opened.MergePatch(seed, nil); err != nil {
	return err
}

definition, err := stardust.Parse(queryText, stardust.DUST)
if err != nil {
	return err
}
defer definition.Close()

query, err := opened.Query(definition)
if err != nil {
	return err
}
defer query.Close()

rows, err := query.Run(nil, stardust.RunOptions{}, nil)
if err != nil {
	return err
}
defer rows.Close()

result, err := rows.Next()
if err != nil {
	return err
}
defer result.Close()
Result / 33B
[{name Ada} {name Bob} {name Cy}]

See Database for storage options, locking and shutdown rules.