If your entities have data and metadata, then I can think of a few ways to restrict access to the metadata, namely:
1. Explicitly list property keys in queries so that metadata isn't returned. This is managing access in your application code with the values(), valueMap() and elementMap() steps, like this:
g.V().has('my_label','my_key','value').values('my_key','my_other_key').next()
This is usually the easiest approach and is a best practice, akin to using SELECT id, name FROM table; instead of SELECT * FROM table;.
2. Add another vertex label just for storing metadata. This means having to traverse an edge to set / get metadata, which adds complexity to the design and application logic. But if the metadata is rarely accessed, then it can be a fairly simple way of hiding the properties.
Note that this backs into a "layered" design to the graph with some of the elements being in the primary application layer, and others being in the metadata layer. If partitioning the graph like this one should also partition the application code similarly.
3. Use meta-properties to control visibility of properties. There's a certain elegance to this approach, but there's a few of caveats.
First, not all graph databases support meta-properties. Second, they often don't perform well in high I/O situations (e.g. data ingest). Third, they may not be honored by the indexing engine.
Have fun!
-Josh