Internally both the hyperedges and the vertices are stored as an AutoArrayHashmap with the associated data and the relations (
https://github.com/yamafaktory/hypergraphz/blob/9f87e705afd7...). Then the implementation diverge since a given hyperedge can hold zero to n vertices, with self-loops (ArrayList). For vertices, we just need to keep track of the hyperedges (AutoArrayHashmap).
Thanks for the feedback! Developing/prototyping is a very pleasant experience in Zig compared to Rust. It's obviously a different approach and some might find the tooling less mature but I quickly realized that the build system (as per 0.13.0) is very solid. You can build the docs, run the tests, etc. I'm a Neovim user and honestly the LSP (ZLS) is stable and you can additionally get the compilation errors (you need to create a check step in your build file). In tests, using with the testing allocator to catch memory leaks guides you while prototyping.
You're right maybe the wording is wrong: query more than manipulate. By the way, querying like jq might be an interesting new feature. Don't know exactly in which direction it should go / what it should do / how exactly it should look like (grammar)
Wow that’s awesome you actually have a jq like implementation. Hmmm since it’s a graph maybe you could go with something like openCypher [0] or GQL [1] (possibly gremlin too) or maybe you could even query it with GraphQL (although GraphQL only traverses down in a tree fashion)? Although some sort of simpler jq like syntax might be able to make more sense. It would need to be able to branch out somehow. I think even an emmet [2] like syntax might work well.