I was wondering whether Neo4j and OrientDB provide the possibility of defining constraints in terms of multiplicity for specific edge types?
Asked
Active
Viewed 457 times
2 Answers
7
For OrientDB
You can set multiplicity on out/in collection per label. Example to set maximum 1 edges from Person to Company if the edge's label is "workFor":
ALTER PROPERTY Person.out_workFor NOT NULL
ALTER PROPERTY Person.out_workFor MAX 1
You can also set the minimum with:
ALTER PROPERTY Person.out_workFor MIN 1
In this way with min & max it's mandatory having one and only one relationship to Company.

Lvca
- 8,938
- 2
- 24
- 25
-
I keep getting a 'property not exists' error when trying to create a constraint using this method. – Ethan Hohensee Mar 04 '16 at 19:27
-1
For Neo4j
What do you want to do happen when the constraint is violated? Exception & Rollback or somehow merge?
For 1:1 cardinality there is merge
MATCH (p:Person {name:"Pablo"})
MATCH (c:Company {name:"Era7"})
MERGE (p)-[:WORKS_FOR]->(c);
For higher cardinality constraints, you can either go with a framework that supports meta-models and schema like structr.org or sylvadb.
Or you can set-up a small tx-event handler that checks your cardinalities and raises an exception if you violate the constraints.
I wanted to write up a blog post about it anyway, so stay tuned.

Michael Hunger
- 41,339
- 3
- 57
- 80
-
What do you mean by merging? I guess I would simply expect it not to create the relationship that does not fulfill the constraint previously expressed somehow when defining the schema. – ppareja Oct 09 '14 at 16:51
-
I stared to provide a project that implements the suggestion: https://github.com/jexp/neo4j-constraints – Michael Hunger Oct 11 '14 at 09:54
-
Any idea if the behavior I previously described will be included in the official version at some point? – ppareja Oct 11 '14 at 17:18