Meset File System


Meset has two main features that distinguish it from the filesystem you probably use every day on your computer.

First, it makes no distinction between files and directories. Directories may contain data that, for example, describes the purpose of the directory or that passes variables to a file browser that describe how to treat the directory. Yes, I know that several file systems already implement directories as files, but they don't allow you to store arbitrary data there. Meset doesn't care whether you think of them as files or directories. From here on, we'll just call them nodes.

Second, Meset allows you to maintain multiple directory structures at the same time. That is, for every conceivable relationship between nodes, you can make a link (edge) between them. GraphFS will allow you to specify a name (though, in implementation, probably just a number, and it will do the specifying) for that relationship (edge role), and it will keep track of all relationships between all nodes. For example, an edge may indicate that one file contains information on a sub-category of the parent or that one file refers to another file (like with 'include' commands from various programming languages). Meset allows more than one edge role for each pair of nodes.

My Implementation

I am currently writing an implementation of this concept for use with Perl and MySQL. I chose these for a variety of reasons. First of all, I have developed this implementation with a particular application in mind. This application runs on somebody else's server, and that server uses Perl and MySQL for most of its programming and database needs. Second, I've been using Perl for most of my programming needs for the past 7 years, so I'm already familiar with it.

This implementation relies on a plugin architecture. Applications may include modules to alter the behavior of the filesystem. For instance, they may add properties to nodes (like permissions for an operating system or password protection), they may alter the way nodes are stored (e.g., adding encryption or versioning information), or they may alter the way edges behave (allowing edge roles to inherit from other edge roles or behave transitively).