DQL @reverse vs GraphQL @hasInverse

Hello,
I have a problem to get child object with DQL:
Here is example:

Schema
type <User> {
	status
	profile
	dob
	email
}
type <UserProfile> {
	firsName
	lastName
	dob
	profile_of
}
<profile>: uid @reverse .
<profile_of>: uid @reverse .

First I create one User object:

 {  
  set {
  _:x <email> "alice@ssaa.com" .
  _:x <dgraph.type> "User" .
  }
}

Then I create the user’s UserProfile

 {  
  set {
      _:x <firsName> "Alice" .
      _:x <profile_of> <0x13d75> .
      _:x <dgraph.type> "UserProfile" .
  }
}

But, when I query the user to get profile as well I got blank:

{
  q(func: type(User)) {
    uid
    email
    profile {
	firsName
    }
  }
}
{
  "data": {
    "q": [
      {
        "uid": "0x13d75",
        "email": "alice@ssaa.com"
      }
    ]
  }

This is possible with GraphQL @hasInverse, but I cannot do it with @reverse.
How can I get the User object with its profile object?

Use tilde notation

{
  q(func: type(User)) {
    uid
    email
    <~profile_of> {
	firsName
    }
  }
}

Thank your help. This works.
From where I am confused:
First I have made an error, It should be profile, not profile_of. When I query an object User, to get all the objects that point to it. With the solution here I have to know all the reverse edges in the query. So, if I add the new object in the schema that points to the User object, and that new object has its own child object then I have to edit all the queries.
The result would be to pull the “profile” and it will pull all the other child objects in the tree without my prior knowledge of the structure. So, when I am parsing with Golang struct to have it all from the top-level User object.
I hope that I have managed to clearly explain my problem here.