{"id":28405639,"url":"https://github.com/hypermodeinc/modusgraph","last_synced_at":"2025-06-29T06:31:01.659Z","repository":{"id":270777346,"uuid":"852093293","full_name":"hypermodeinc/modusGraph","owner":"hypermodeinc","description":"modusGraph: a transactional, embedded database system for model-native apps","archived":false,"fork":false,"pushed_at":"2025-06-13T20:23:43.000Z","size":492,"stargazers_count":16,"open_issues_count":2,"forks_count":1,"subscribers_count":2,"default_branch":"main","last_synced_at":"2025-06-13T21:21:46.064Z","etag":null,"topics":["database","embedded","go"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hypermodeinc.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-09-04T08:01:45.000Z","updated_at":"2025-06-13T20:07:28.000Z","dependencies_parsed_at":"2025-04-16T13:22:48.957Z","dependency_job_id":"d4868ba4-43fe-4b2f-8d7d-face53ee89bb","html_url":"https://github.com/hypermodeinc/modusGraph","commit_stats":null,"previous_names":["hypermodeinc/modusdb","hypermodeinc/modusgraph"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/hypermodeinc/modusGraph","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hypermodeinc%2FmodusGraph","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hypermodeinc%2FmodusGraph/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hypermodeinc%2FmodusGraph/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hypermodeinc%2FmodusGraph/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hypermodeinc","download_url":"https://codeload.github.com/hypermodeinc/modusGraph/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hypermodeinc%2FmodusGraph/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262546694,"owners_count":23327011,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["database","embedded","go"],"created_at":"2025-06-01T21:37:30.573Z","updated_at":"2025-06-29T06:31:01.651Z","avatar_url":"https://github.com/hypermodeinc.png","language":"Go","readme":"\u003cdiv align=\"center\"\u003e\n\n[![modus](https://github.com/user-attachments/assets/1a6020bd-d041-4dd0-b4a9-ce01dc015b65)](https://github.com/hypermodeinc/modusgraph)\n\n[![GitHub License](https://img.shields.io/github/license/hypermodeinc/modusdb)](https://github.com/hypermodeinc/modusgraph?tab=Apache-2.0-1-ov-file#readme)\n[![chat](https://img.shields.io/discord/1267579648657850441)](https://discord.gg/NJQ4bJpffF)\n[![GitHub Repo stars](https://img.shields.io/github/stars/hypermodeinc/modusdb)](https://github.com/hypermodeinc/modusgraph/stargazers)\n[![GitHub commit activity](https://img.shields.io/github/commit-activity/m/hypermodeinc/modusdb)](https://github.com/hypermodeinc/modusgraph/commits/main/)\n\n\u003c/div\u003e\n\n\u003cp align=\"center\"\u003e\n   \u003ca href=\"https://docs.hypermode.com/\"\u003eDocs\u003c/a\u003e\n   \u003cspan\u003e · \u003c/span\u003e\n   \u003ca href=\"https://discord.gg/4z4GshR7fq\"\u003eDiscord\u003c/a\u003e\n\u003cp\u003e\n\n**modusGraph is a high-performance, transactional database system.** It's designed to be type-first,\nschema-agnostic, and portable. ModusGraph provides object-oriented APIs that make it simple to build\nnew apps, paired with support for advanced use cases through the Dgraph Query Language (DQL). A\ndynamic schema allows for natural relations to be expressed in your data with performance that\nscales with your use case.\n\nmodusGraph is available as a Go package for running in-process, providing low-latency reads, writes,\nand vector searches. We’ve made trade-offs to prioritize speed and simplicity. When runnning\nin-process, modusGraph internalizes Dgraph's server components, and data is written to a local\nfile-based database. modusGraph also supports remote Dgraph servers, allowing you deploy your apps\nto any Dgraph cluster simply by changing the connection string.\n\nThe [modus framework](https://github.com/hypermodeinc/modus) is optimized for apps that require\nsub-second response times. ModusGraph augments polyglot functions with simple to use data and vector\nstorage. When paired together, you can build a complete AI semantic search or retrieval-augmented\ngeneration (RAG) feature with a single framework.\n\n## Quickstart\n\n```go\npackage main\n\nimport (\n    \"context\"\n    \"fmt\"\n    \"time\"\n\n    mg \"github.com/hypermodeinc/modusgraph\"\n)\n\ntype TestEntity struct {\n    Name        string    `json:\"name,omitempty\" dgraph:\"index=exact\"`\n    Description string    `json:\"description,omitempty\" dgraph:\"index=term\"`\n    CreatedAt   time.Time `json:\"createdAt,omitempty\"`\n\n    // UID is a required field for nodes\n    UID string `json:\"uid,omitempty\"`\n    // DType is a required field for nodes, will get populated with the struct name\n    DType []string `json:\"dgraph.type,omitempty\"`\n}\n\nfunc main() {\n    // Use a file URI to connect to a in-process modusGraph instance, ensure that the directory exists\n    uri := \"file:///tmp/modusgraph\"\n    // Assigning a Dgraph URI will connect to a remote Dgraph server\n    // uri := \"dgraph://localhost:9080\"\n\n    client, err := mg.NewClient(uri, mg.WithAutoSchema(true))\n    if err != nil {\n        panic(err)\n    }\n    defer client.Close()\n\n    entity := TestEntity{\n        Name:        \"Test Entity\",\n        Description: \"This is a test entity\",\n        CreatedAt:   time.Now(),\n    }\n\n    ctx := context.Background()\n    err = client.Insert(ctx, \u0026entity)\n\n    if err != nil {\n        panic(err)\n    }\n    fmt.Println(\"Insert successful, entity UID:\", entity.UID)\n\n    // Query the entity\n    var result TestEntity\n    err = client.Get(ctx, \u0026result, entity.UID)\n    if err != nil {\n        panic(err)\n    }\n    fmt.Println(\"Query successful, entity:\", result.UID)\n}\n```\n\n## Creating a Client\n\nThe `NewClient` function takes a URI and optional configuration options.\n\n```go\nclient, err := mg.NewClient(uri)\nif err != nil {\n    panic(err)\n}\ndefer client.Close()\n```\n\n### URI Options\n\nmodusGraph supports two URI schemes for managing graph databases:\n\n#### `file://` - Local File-Based Database\n\nConnects to a database stored locally on the filesystem. This mode doesn't require a separate\ndatabase server and is perfect for development, testing, or embedded applications. The directory\nmust exist before connecting.\n\nFile-based databases do not support concurrent access from separate processes.\n\n```go\n// Connect to a local file-based database\nclient, err := mg.NewClient(\"file:///path/to/data\")\n```\n\n#### `dgraph://` - Remote Dgraph Server\n\nConnects to a Dgraph cluster. For more details on the Dgraph URI format, see the\n[Dgraph Dgo documentation](https://github.com/hypermodeinc/dgo#connection-strings).\n\n```go\n// Connect to a remote Dgraph server\nclient, err := mg.NewClient(\"dgraph://hostname:9080\")\n```\n\n### Configuration Options\n\nmodusGraph provides several configuration options that can be passed to the `NewClient` function:\n\n#### WithAutoSchema(bool)\n\nEnables or disables automatic schema management. When enabled, modusGraph will automatically create\nand update the graph database schema based on the struct tags of objects you insert.\n\n```go\n// Enable automatic schema management\nclient, err := mg.NewClient(uri, mg.WithAutoSchema(true))\n```\n\n#### WithPoolSize(int)\n\nSets the size of the connection pool for better performance under load. The default is 10\nconnections.\n\n```go\n// Set pool size to 20 connections\nclient, err := mg.NewClient(uri, mg.WithPoolSize(20))\n```\n\n#### WithLogger(logr.Logger)\n\nConfigures structured logging with custom verbosity levels. By default, logging is disabled.\n\n```go\n// Set up a logger\nlogger := logr.New(logr.Discard())\nclient, err := mg.NewClient(uri, mg.WithLogger(logger))\n```\n\nYou can combine multiple options:\n\n```go\n// Using multiple configuration options\nclient, err := mg.NewClient(uri,\n    mg.WithAutoSchema(true),\n    mg.WithPoolSize(20),\n    mg.WithLogger(logger))\n```\n\n## Defining Your Graph with Structs\n\nmodusGraph uses Go structs to define your graph database schema. By adding `json` and `dgraph` tags\nto your struct fields, you tell modusGraph how to store and index your data in the graph database.\n\n### Basic Structure\n\nEvery struct that represents a node in your graph should include:\n\n```go\ntype MyNode struct {\n    // Your fields here with appropriate tags\n\n    // These fields are required for Dgraph integration\n    UID   string   `json:\"uid,omitempty\"`\n    DType []string `json:\"dgraph.type,omitempty\"`\n}\n```\n\n### `dgraph` Field Tags\n\nmodusGraph uses struct tags to define how each field should be handled in the graph database:\n\n| Directive   | Option   | Description                                                         | Example                                                                              |\n| ----------- | -------- | ------------------------------------------------------------------- | ------------------------------------------------------------------------------------ |\n| **index**   | exact    | Creates an exact-match index for string fields                      | Name string \u0026#96;json:\"name\" dgraph:\"index=exact\"\u0026#96;                               |\n|             | hash     | Creates a hash index (same as exact)                                | Code string \u0026#96;json:\"code\" dgraph:\"index=hash\"\u0026#96;                                |\n|             | term     | Creates a term index for text search                                | Description string \u0026#96;json:\"description\" dgraph:\"index=term\"\u0026#96;                  |\n|             | fulltext | Creates a full-text search index                                    | Content string \u0026#96;json:\"content\" dgraph:\"index=fulltext\"\u0026#96;                      |\n|             | int      | Creates an index for integer fields                                 | Age int \u0026#96;json:\"age\" dgraph:\"index=int\"\u0026#96;                                      |\n|             | geo      | Creates a geolocation index                                         | Location \u0026#96;json:\"location\" dgraph:\"index=geo\"\u0026#96;                                |\n|             | day      | Creates a day-based index for datetime fields                       | Created time.Time \u0026#96;json:\"created\" dgraph:\"index=day\"\u0026#96;                        |\n|             | year     | Creates a year-based index for datetime fields                      | Birthday time.Time \u0026#96;json:\"birthday\" dgraph:\"index=year\"\u0026#96;                     |\n|             | month    | Creates a month-based index for datetime fields                     | Hired time.Time \u0026#96;json:\"hired\" dgraph:\"index=month\"\u0026#96;                          |\n|             | hour     | Creates an hour-based index for datetime fields                     | Login time.Time \u0026#96;json:\"login\" dgraph:\"index=hour\"\u0026#96;                           |\n|             | hnsw     | Creates a vector similarity index                                   | Vector \\*dg.VectorFloat32 \u0026#96;json:\"vector\" dgraph:\"index=hnsw(metric:cosine)\"\u0026#96; |\n| **type**    | geo      | Specifies a geolocation field                                       | Location \u0026#96;json:\"location\" dgraph:\"type=geo\"\u0026#96;                                 |\n|             | datetime | Specifies a datetime field                                          | CreatedAt time.Time \u0026#96;json:\"createdAt\" dgraph:\"type=datetime\"\u0026#96;                |\n|             | int      | Specifies an integer field                                          | Count int \u0026#96;json:\"count\" dgraph:\"type=int\"\u0026#96;                                   |\n|             | float    | Specifies a floating-point field                                    | Price float64 \u0026#96;json:\"price\" dgraph:\"type=float\"\u0026#96;                             |\n|             | bool     | Specifies a boolean field                                           | Active bool \u0026#96;json:\"active\" dgraph:\"type=bool\"\u0026#96;                               |\n|             | password | Specifies a password field (stored securely)                        | Password string \u0026#96;json:\"password\" dgraph:\"type=password\"\u0026#96;                     |\n| **count**   |          | Creates a count index                                               | Visits int \u0026#96;json:\"visits\" dgraph:\"count\"\u0026#96;                                    |\n| **unique**  |          | Enforces uniqueness for the field (remote Dgraph only)              | Email string \u0026#96;json:\"email\" dgraph:\"index=hash unique\"\u0026#96;                       |\n| **upsert**  |          | Allows a field to be used in upsert operations (remote Dgraph only) | UserID string \u0026#96;json:\"userID\" dgraph:\"index=hash upsert\"\u0026#96;                     |\n| **reverse** |          | Creates a bidirectional edge                                        | Friends []\\*Person \u0026#96;json:\"friends\" dgraph:\"reverse\"\u0026#96;                         |\n| **lang**    |          | Enables multi-language support for the field                        | Description string \u0026#96;json:\"description\" dgraph:\"lang\"\u0026#96;                        |\n\n### Relationships\n\nRelationships between nodes are defined using struct pointers or slices of struct pointers:\n\n```go\ntype Person struct {\n    Name     string    `json:\"name,omitempty\" dgraph:\"index=exact\"`\n    Friends  []*Person `json:\"friends,omitempty\"`\n    Manager  *Person   `json:\"manager,omitempty\"`\n\n    UID   string   `json:\"uid,omitempty\"`\n    DType []string `json:\"dgraph.type,omitempty\"`\n}\n```\n\n### Reverse Edges\n\nReverse edges allow efficient bidirectional traversal. When you query in the reverse direction, use\nthe tilde prefix in your JSON tag:\n\n```go\ntype Student struct {\n    Name       string   `json:\"name,omitempty\" dgraph:\"index=exact\"`\n    Takes_Class []*Class `json:\"takes_class,omitempty\" dgraph:\"reverse\"`\n\n    UID   string   `json:\"uid,omitempty\"`\n    DType []string `json:\"dgraph.type,omitempty\"`\n}\n\ntype Class struct {\n    Name     string     `json:\"name,omitempty\" dgraph:\"index=exact\"`\n    Students []*Student `json:\"~takes_class,omitempty\"` // Reverse edge\n\n    UID   string   `json:\"uid,omitempty\"`\n    DType []string `json:\"dgraph.type,omitempty\"`\n}\n```\n\nAdvanced querying is required to properly bind reverse edges in query results. See the\n`TestReverseEdgeQuery` test in [query_test.go](./query_test.go) for an example.\n\n## Basic Operations\n\nmodusGraph provides a simple API for common database operations.\n\n### Inserting Data\n\nTo insert a new node into the database:\n\n```go\nctx := context.Background()\n\n// Create a new object\nuser := User{\n    Name:  \"John Doe\",\n    Email: \"john@example.com\",\n    Role:  \"Admin\",\n}\n\n// Insert it into the database\nerr := client.Insert(ctx, \u0026user)\nif err != nil {\n    log.Fatalf(\"Failed to create user: %v\", err)\n}\n\n// The UID field will be populated after insertion\nfmt.Println(\"Created user with UID:\", user.UID)\n```\n\n### Updating Data\n\nTo update an existing node, first retrieve it, modify it, then save it back:\n\n```go\nctx := context.Background()\n\n// Get the existing object by UID\nvar user User\nerr := client.Get(ctx, \u0026user, \"0x1234\")\nif err != nil {\n    log.Fatalf(\"Failed to get user: %v\", err)\n}\n\n// Modify fields\nuser.Name = \"Jane Doe\"\nuser.Role = \"Manager\"\n\n// Save the changes\nerr = client.Update(ctx, \u0026user)\nif err != nil {\n    log.Fatalf(\"Failed to update user: %v\", err)\n}\n```\n\n### Deleting Data\n\nTo delete one or more nodes from the database:\n\n```go\nctx := context.Background()\n\n// Delete by UID\nerr := client.Delete(ctx, []string{\"0x1234\", \"0x5678\"})\nif err != nil {\n    log.Fatalf(\"Failed to delete node: %v\", err)\n}\n```\n\n### Querying Data\n\nmodusGraph provides a basic query API for retrieving data:\n\n```go\nctx := context.Background()\n\n// Basic query to get all users\nvar users []User\nerr := client.Query(ctx, User{}).Nodes(\u0026users)\nif err != nil {\n    log.Fatalf(\"Failed to query users: %v\", err)\n}\n\n// Query with filters\nvar adminUsers []User\nerr = client.Query(ctx, User{}).\n    Filter(`eq(role, \"Admin\")`).\n    Nodes(\u0026adminUsers)\nif err != nil {\n    log.Fatalf(\"Failed to query admin users: %v\", err)\n}\n\n// Query with pagination\nvar pagedUsers []User\nerr = client.Query(ctx, User{}).\n    Filter(`has(name)`).\n    Offset(10).\n    Limit(5).\n    Nodes(\u0026pagedUsers)\nif err != nil {\n    log.Fatalf(\"Failed to query paged users: %v\", err)\n}\n\n// Query with ordering\nvar sortedUsers []User\nerr = client.Query(ctx, User{}).\n    Order(\"name\").\n    Nodes(\u0026sortedUsers)\nif err != nil {\n    log.Fatalf(\"Failed to query sorted users: %v\", err)\n}\n```\n\n### Advanced Querying\n\nmodusGraph is built on top of the [dgman](https://github.com/dolan-in/dgman) package, which provides\naccess to Dgraph's more powerful and complete query capabilities. For advanced use cases, you can\naccess the underlying Dgraph client directly and construct more sophisticated queries:\n\n```go\n// Define a struct with vector field for similarity search\ntype Product struct {\n    Name        string            `json:\"name,omitempty\" dgraph:\"index=term\"`\n    Description string            `json:\"description,omitempty\"`\n    Vector      *dg.VectorFloat32 `json:\"vector,omitempty\" dgraph:\"index=hnsw(metric:cosine)\"`\n\n    UID   string   `json:\"uid,omitempty\"`\n    DType []string `json:\"dgraph.type,omitempty\"`\n}\n\n// Get similar products using vector similarity search\nfunc getSimilarProducts(client mg.Client, embeddings []float32) (*Product, error) {\n    ctx := context.Background()\n\n    // Convert vector to string format for query\n    vectorStr := fmt.Sprintf(\"%v\", embeddings)\n    vectorStr = strings.Trim(strings.ReplaceAll(vectorStr, \" \", \", \"), \"[]\")\n\n    // Create result variable\n    var result Product\n\n    // Get access to the underlying Dgraph client\n    dgo, cleanup, err := client.DgraphClient()\n    if err != nil {\n        return nil, err\n    }\n    defer cleanup()\n\n    // Construct query using similar_to function with a parameter for the vector\n    query := dg.NewQuery().Model(\u0026result).RootFunc(\"similar_to(vector, 1, $vec)\")\n\n    // Execute query with variables\n    tx := dg.NewReadOnlyTxn(dgo)\n    err = tx.Query(query).\n        Vars(\"similar_to($vec: string)\", map[string]string{\"$vec\": vectorStr}).\n        Scan()\n\n    if err != nil {\n        return nil, err\n    }\n\n    return \u0026result, nil\n}\n```\n\nThis example demonstrates vector similarity search for finding semantically similar items - a\npowerful feature in Dgraph. You can also access other advanced capabilities like full-text search\nwith language-specific analyzers, geolocation queries, and more. The ability to access the raw\nDgraph client gives you the full power of Dgraph's query language while still benefiting from\nmodusGraph's simplified client interface and schema management.\n\n## Schema Management\n\nmodusGraph provides robust schema management features that simplify working with Dgraph's schema\nsystem.\n\n### AutoSchema\n\nThe AutoSchema feature automatically generates and updates the database schema based on your Go\nstruct definitions. When enabled, modusGraph will analyze the struct tags of objects you insert and\nensure the appropriate schema exists in the database.\n\nEnable AutoSchema when creating a client:\n\n```go\n// Enable automatic schema management\nclient, err := mg.NewClient(uri, mg.WithAutoSchema(true))\nif err != nil {\n    log.Fatalf(\"Failed to create client: %v\", err)\n}\n\n// Now you can insert objects without manually creating the schema first\nuser := User{\n    Name:  \"John Doe\",\n    Email: \"john@example.com\",\n}\n\n// The schema will be automatically created or updated as needed\nerr = client.Insert(ctx, \u0026user)\n```\n\nWith AutoSchema enabled, modusGraph will:\n\n1. Analyze the struct tags of objects being inserted\n2. Generate the appropriate Dgraph schema based on these tags\n3. Apply any necessary schema updates to the database\n4. Handle type definitions for node types based on struct names\n\nThis is particularly useful during development when your schema is evolving frequently.\n\n### Schema Operations\n\nFor more control over schema management, modusGraph provides several methods in the Client\ninterface:\n\n#### UpdateSchema\n\nManually update the schema based on one or more struct types:\n\n```go\n// Update schema based on User and Post structs\nerr := client.UpdateSchema(ctx, User{}, Post{})\nif err != nil {\n    log.Fatalf(\"Failed to update schema: %v\", err)\n}\n```\n\nThis is useful when you want to ensure the schema is created before inserting data, or when you need\nto update the schema for new struct types.\n\n#### GetSchema\n\nRetrieve the current schema definition from the database:\n\n```go\n// Get the current schema\nschema, err := client.GetSchema(ctx)\nif err != nil {\n    log.Fatalf(\"Failed to get schema: %v\", err)\n}\n\nfmt.Println(\"Current schema:\")\nfmt.Println(schema)\n```\n\nThe returned schema is in Dgraph Schema Definition Language format.\n\n#### DropAll and DropData\n\nReset the database completely or just clear the data:\n\n```go\n// Remove all data but keep the schema\nerr := client.DropData(ctx)\nif err != nil {\n    log.Fatalf(\"Failed to drop data: %v\", err)\n}\n\n// Or remove both schema and data\nerr = client.DropAll(ctx)\nif err != nil {\n    log.Fatalf(\"Failed to drop all: %v\", err)\n}\n```\n\nThese operations are useful for testing or when you need to reset your database state.\n\n## Limitations\n\nmodusGraph has a few limitations to be aware of:\n\n- **Unique constraints in file-based mode**: Due to the intricacies of how Dgraph handles unique\n  fields and upserts in its core package, unique field checks and upsert operations are not\n  supported (yet) when using the local (file-based) mode. These operations work properly when using\n  a full Dgraph cluster, but the simplified file-based mode does not support the constraint\n  enforcement mechanisms required for uniqueness guarantees.\n\n- **Schema evolution**: While modusGraph supports schema inference through tags, evolving an\n  existing schema with new fields requires careful consideration to avoid data inconsistencies.\n\n## CLI Commands and Examples\n\nmodusGraph provides several command-line tools and example applications to help you interact with\nand explore the package. These are organized in the `cmd` and `examples` folders:\n\n### Commands (`cmd` folder)\n\n- **`cmd/query`**: A flexible CLI tool for running arbitrary DQL (Dgraph Query Language) queries\n  against a modusGraph database.\n  - Reads a query from standard input and prints JSON results.\n  - Supports file-based modusGraph storage.\n  - Flags: `--dir`, `--pretty`, `--timeout`, `-v` (verbosity).\n  - See [`cmd/query/README.md`](./cmd/query/README.md) for usage and examples.\n\n### Examples (`examples` folder)\n\n- **`examples/basic`**: Demonstrates CRUD operations for a simple `Thread` entity.\n\n  - Flags: `--dir`, `--addr`, `--cmd`, `--author`, `--name`, `--uid`, `--workspace`.\n  - Supports create, update, delete, get, and list commands.\n  - See [`examples/basic/README.md`](./examples/basic/README.md) for details.\n\n- **`examples/load`**: Shows how to load the standard 1million RDF dataset into modusGraph for\n  benchmarking.\n\n  - Downloads, initializes, and loads the dataset into a specified directory.\n  - Flags: `--dir`, `--verbosity`.\n  - See [`examples/load/README.md`](./examples/load/README.md) for instructions.\n\nYou can use these tools as starting points for your own applications or as references for\nintegrating modusGraph into your workflow.\n\n## Open Source\n\nThe modus framework, including modusGraph, is developed by [Hypermode](https://hypermode.com/) as an\nopen-source project, integral but independent from Hypermode.\n\nWe welcome external contributions. See the [CONTRIBUTING.md](./CONTRIBUTING.md) file if you would\nlike to get involved.\n\nModus and its components are © Hypermode Inc., and licensed under the terms of the Apache License,\nVersion 2.0. See the [LICENSE](./LICENSE) file for a complete copy of the license. If you have any\nquestions about modus licensing, or need an alternate license or other arrangement, please contact\nus at \u003chello@hypermode.com\u003e.\n\n## Windows Users\n\nmodusGraph (and its dependencies) are designed to work on POSIX-compliant operating systems, and are\nnot guaranteed to work on Windows.\n\nTests at the top level folder (`go test .`) on Windows are maintained to pass on Windows, but other\ntests in subfolders may not work as expected.\n\nTemporary folders created during tests may not be cleaned up properly on Windows. Users should\nperiodically clean up these folders. The temporary folders are created in the Windows temp\ndirectory, `C:\\Users\\\u003cusername\u003e\\AppData\\Local\\Temp\\modusgraph_test*`.\n\n## Acknowledgements\n\nmodusGraph builds heavily upon packages from the open source projects of\n[Dgraph](https://github.com/hypermodeinc/dgraph) (graph query processing and transaction\nmanagement), [Badger](https://github.com/dgraph-io/badger) (data storage), and\n[Ristretto](https://github.com/dgraph-io/ristretto) (cache). modusGraph also relies on the\n[dgman](https://github.com/dolan-in/dgman) repository for much of its functionality. We expect the\narchitecture and implementations of modusGraph and Dgraph to expand in differentiation over time as\nthe projects optimize for different core use cases, while maintaining Dgraph Query Language (DQL)\ncompatibility.\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhypermodeinc%2Fmodusgraph","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhypermodeinc%2Fmodusgraph","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhypermodeinc%2Fmodusgraph/lists"}