In addition to the three main features, there's some other relatively lesser, less used features of OCL that I just wanted to mention. There's the concept of tuples. This is similar to what you would do in a programming language where you would have structs or records.
There are frenzy enumerations that you see in, in Java and other languages. There's the ability to express messages. We haven't gone into this as much but in UML diagrams, you can express messages.
There's access to the UML meta model. And there's the concept little word concept of automatic flattening. Say, we did our navigation, and along the way we came upon two situations, two associations which were have many participants in them.
So we might end up with a set of sets, or a set of bags, or something like that. OCL has made the decision to do automatic flattening, that says if you have a set of sets, you just get one set. You don't in your syntax have to express two levels of access in order to get at the contents.
This can make it a little bit easier to write your expressions.