---
title: Query relationships bidirectionally
description: "Relationships between two managed objects come in two forms: forward and reverse. Forward relationships mean one side points to the other in a uni-directional flow. Reverse relationships means both sides point to the other in a bidirectional flow."
component: pingoneaic
page_id: pingoneaic:idm-objects:reverse-relationships
canonical_url: https://docs.pingidentity.com/pingoneaic/idm-objects/reverse-relationships.html
keywords: ["Data Object Model", "Relationships"]
---

# Query relationships bidirectionally

Relationships between two managed objects come in two forms: *forward* and *reverse*. Forward relationships mean one side points to the other in a uni-directional flow. Reverse relationships means both sides point to the other in a bidirectional flow.

Most cases use reverse or bidirectional relationships for efficient querying of objects. For example, a relationship between a user and his manager might indicate a *reverse relationship* between the manager and her direct report. You may want to query `jdoe`'s user entry to discover who his manager is, *or* query `bjensen`'s user entry to discover all the users who report to `bjensen`.

You define a reverse relationship within a relationship definition. Consider the following sample excerpt of the default managed object configuration:

```json
"reports" : {
  "description" : "Direct Reports",
  "title" : "Direct Reports",
  ...
  "type" : "array",
  "returnByDefault" : false,
  "items" : {
    "type" : "relationship",
    "reverseRelationship" : true,
    "reversePropertyName" : "manager",
    "validate" : true,
    ...
  }
  ...
```

The `reports` property is a `relationship` type between users and managers, so you can *refer* to a managed user's reports by referencing the `reports` object. However, the `reports` property is also a reverse relationship (`"reverseRelationship":true`), which means you can list all users that reference that report.

You can list all users whose `manager` property is set to the currently queried user.

The reverse relationship includes an optional `resourceCollection` that lets you query a set of objects, based on specific fields:

```json
"resourceCollection" : [
  {
    "path" : "managed/realm-name_user",
    "label" : "User",
    "query" : {
      "queryFilter" : "true",
      "fields" : [
        "userName",
        "givenName",
        "sn"
      ]
    }
  }
]
```

The `path` property of the `resourceCollection` points to the set of objects to be queried. If this path is not in the local repository, the link expansion can incur a significant performance cost. Although the `resourceCollection` is optional, the same performance cost is incurred if the property is absent.

The `query` property indicates how you will query this resource collection to configure the relationship. In this case, `"queryFilter":true` indicates that you can search on any of the properties listed in the `fields` array when you are assigning a manager to a user or a new report to a manager.
