We need to talk about properties, but before we can do that, we need to talk about types. In a previous post we looked at the various alternatives for typing and their pros and cons. Graph databases may take the two following approaches to typing, and anything in between:
- No types at all: nodes, edges and properties have no types; anything goes.
- Fully typed: nodes, edges and properties are all strongly typed; the graph database refuses to perform an operation that is not consistent with the type system.
There are some graph databases on the market that require types for some elements (edges, for example) but don’t allow types for others (nodes, or properties), so hybrids are possible.
A totally untyped graph database has it easy: it allows an arbitrary number of properties, distinguished only by name and with arbitrary values. So the operations are:
Defined on Node and/or Edge:
setProperty( String label, Object value ); // returns nothing getProperty( String label ); // returns the value getAllProperties(); // returns a set of all current property labels
A fully typed graph database needs to offer a much larger set of operations. They are:
Defined on Node:
bless( NodeType type ); // returns nothing unbless( NodeType type ); // returns nothing getTypes(); // returns a set of all current NodeTypes setProperty( PropertyType type, Object value ); // returns nothing getProperty( PropertyType type ); // returns the value of the Property
Defined on Edge:
bless( EdgeType type ); // returns nothing unbless( EdgeType type ); // returns nothing getTypes(); // returns a set of all current EdgeTypes setProperty( PropertyType type, Object value ); // returns nothing getProperty( PropertyType type ); // returns the value of the Property
To determine the available properties, one examines the meta-data available in the type system:
Defined on NodeType and on EdgeType
getPropertyTypes(); // returns a set of all possible properties defined by the type
The abstract API I’m listing here is the general case for a fully dynamically-typed hypothetical graph database. No product that I’m aware of implements them all, but InfoGrid comes close. If you read the JavaDoc for MeshObject, for example (MeshObject is InfoGrid’s name for Node), you will find all of the above Node operations. The operations are also there for Relationships (InfoGrid’s name for Edge) except that for efficiency reasons 1) they are defined on MeshObject, and 2) InfoGrid does not support properties on edges. (InfoGrid V1 used to, but we decided to eliminate that support; will talk about that some other time).
If a graph database was fully typed but using a static type system, we obviously could not bless either nodes or edges with new types at run-time as this API defines. (InfoGrid V1 used to be that way; InfoGrid V2 is fully dynamic).
In the next part, we’ll talk about properties then.