Here is how I would do it.
I will assume all Relerences are Peer for this exercise but of course the Reference between Client and Schedule would I suspect be best as OWNS
The Reference Attribute in Client for many Schedules..... Name the Attribute pm_Schedules (and ensure is is multiple) and the reverse matching Reference in Schedule, name that ps_Client (and ensure it is NOT multiple)
The Reference Attribute in Schedule for many Risks...Name the Attribute pm_Risks (and ensure is is multiple) and the reverse matching Reference in Risk, name that ps_Schedule (and ensure it is NOT multiple)
You will RARELY EVER need to use the ID attribute of a BO.
So, if you are wanting to FIND the Schedules that belong to a Client.... and you have that Client in context.. ie. have passed it as the Input to a Process, then
FIND Schedule WHERE Schedule IN Client.pm_Schedules
Alternatively you can achieve the same result by
FIND Schedule WHERE Schedule.ps_Client = Client
Also, if you want to say, FIND all the Risks for a partiulare Client regardless of their Schedule....
Again, assuming the Client in question is in context....
FIND Risk WHERE Risk.ps_Schedule.ps_Client = CLient
Using .ID except in those rare circumstances is fighting against the Aware IM engine and is missing out on taking advantage of the AWESOME strength of Aware References.
Hope this helps.