Back to all resources
ContX IQ ContX IQ Json

ContX IQ: loyalty program.

A subject Application can authenticate with its API Key, provides a license plate number as input and gets the external_id of a credit card as the response.

ContX IQ: loyalty program.

A subject Application can authenticate with its API Key, provides a license plate number and gets the external_id of a credit card as the response.

Use case

This use case requires pre-conditions for a response:

- First, the owner of the car has registered the license plate number.

- Second, all users of the car must be on the same loyalty plan.

- Lastly, the access for the app must be enabled by a consent that is not yet expired.

ikg

Requirements

- ServiceAccount credentials created in the IndyKite Hub for your organization.

- AppAgent credentials created in the IndyKite Hub, using the REST endpoints or using Terraform for your Project / Application.

Steps

1. Using the AppAgent credential as API Key (name: X-IK-ClientKey), ingest data in your IKG (IndyKite Knowledge Graph) using the script provided.

2. Using the ServiceAccount credential as Bearer token, create a CIQ Policy to get credit card information from a license plate number, based on relationships between nodes and context.

3. Using the ServiceAccount credential as Bearer token, create a CIQ Query in the context of the policy to retrieve the data.

4. Using the AppAgent credential as API Key (name: X-IK-ClientKey), run a CIQ Execution.

5. Delete your configuration.

Step 1

Ingest the nodes needed for this use case.

POST https://eu.api.indykite.com/capture/v1/nodes/Json
{
  "nodes": [
    {
      "external_id": "alice",
      "is_identity": true,
      "type": "Person",
      "properties": [
        {
          "type": "email",
          "value": "alice@email.com"
        },
        {
          "type": "given_name",
          "value": "Alice"
        },
        {
          "type": "last_name",
          "value": "Smith"
        }
      ]
    },
    {
      "external_id": "ole",
      "is_identity": true,
      "type": "Person",
      "properties": [
        {
          "type": "email",
          "value": "ole@yahoo.co.uk"
        },
        {
          "type": "given_name",
          "value": "ole"
        },
        {
          "type": "last_name",
          "value": "einar"
        }
      ]
    },
    {
      "external_id": "cb2563",
      "type": "PaymentMethod",
      "properties": [
        {
          "type": "payment_name",
          "value": "Credit Card Parking"
        },
        {
          "type": "preference",
          "value": "Pay as you go"
        }
      ]
    },
    {
      "external_id": "carOle",
      "type": "Vehicle",
      "properties": [
        {
          "type": "category",
          "value": "Car"
        },
        {
          "type": "is_active",
          "value": true
        },
        {
          "type": "vin",
          "value": "pcfjnm78"
        }
      ]
    },
    {
      "external_id": "licenseOle",
      "type": "LicenseNumber",
      "properties": [
        {
          "type": "status",
          "value": "Active"
        },
        {
          "type": "number",
          "value": "AL98745",
          "metadata": {
            "assurance_level": 3,
            "source": "BRREG"
          }
        }
      ]
    },
    {
      "external_id": "loyalty1",
      "type": "Loyalty",
      "properties": [
        {
          "type": "name",
          "value": "Parking Loyalty Plan"
        }
      ]
    },
    {
      "external_id": "consent1",
      "type": "ConsentPayment",
      "properties": [
        {
          "type": "name",
          "value": "Consent Parking"
        }
      ]
    },
    {
      "external_id": "companyParking",
      "type": "Company",
      "properties": [
        {
          "type": "name",
          "value": "City Parking Inc"
        }
      ]
    },
    {
      "external_id": "applicationParking",
      "type": "Application",
      "properties": [
        {
          "type": "name",
          "value": "City Mall Parking"
        }
      ]
    }
  ]
}

Ingest the relationships needed for this use case.

POST https://eu.api.indykite.com/capture/v1/relationships/Json
{
  "relationships": [
    {
      "source": {
        "external_id": "ole",
        "type": "Person"
      },
      "target": {
        "external_id": "cb2563",
        "type": "PaymentMethod"
      },
      "type": "HAS"
    },
    {
      "source": {
        "external_id": "ole",
        "type": "Person"
      },
      "target": {
        "external_id": "carOle",
        "type": "Car"
      },
      "type": "OWNS"
    },
    {
      "source": {
        "external_id": "ole",
        "type": "Person"
      },
      "target": {
        "external_id": "loyalty1",
        "type": "Loyalty"
      },
      "type": "IS_MEMBER"
    },
    {
      "source": {
        "external_id": "alice",
        "type": "Person"
      },
      "target": {
        "external_id": "loyalty1",
        "type": "Loyalty"
      },
      "type": "IS_MEMBER"
    },
    {
      "source": {
        "external_id": "ole",
        "type": "Person"
      },
      "target": {
        "external_id": "consent1",
        "type": "ConsentPayment"
      },
      "type": "GRANTED"
    },
    {
      "source": {
        "external_id": "carOle",
        "type": "Car"
      },
      "target": {
        "external_id": "licenseOle",
        "type": "LicenseNumber"
      },
      "type": "HAS"
    },
    {
      "source": {
        "external_id": "consent1",
        "type": "ConsentPayment"
      },
      "target": {
        "external_id": "cb2563",
        "type": "PaymentMethod"
      },
      "type": "GRANTED"
    },
    {
      "source": {
        "external_id": "companyParking",
        "type": "Company"
      },
      "target": {
        "external_id": "applicationParking",
        "type": "Application"
      },
      "type": "OWNS"
    },
    {
      "source": {
        "external_id": "applicationParking",
        "type": "Application"
      },
      "target": {
        "external_id": "consent1",
        "type": "ConsentPayment"
      },
      "type": "USES"
    }
  ]
}

Step 2

CIQ Policy which designates how to get credit card information from a license plate number, based on relationships between nodes and context.

policy.jsonJson
{
  "meta": {
    "policy_version": "1.0-ciq"
  },
  "subject": {
    "type": "_Application"
  },
  "condition": {
    "cypher": "MATCH (subject:_Application) MATCH (app:Application)-[:USES]->(consentpayment:ConsentPayment)<-[:GRANTED]-(person:Person)-[:HAS]->(paymentmethod:PaymentMethod) MATCH (person)-[:IS_MEMBER]->(loyalty:Loyalty) MATCH (person)-[:OWNS]->(car:Car)-[:HAS]->(ln:LicenseNumber)",
    "filter": [
      {
        "operator": "AND",
        "operands": [
          {
            "attribute": "app.external_id",
            "operator": "=",
            "value": "$app_external_id"
          },
          {
            "attribute": "subject.external_id",
            "operator": "=",
            "value": "$_appId"
          }
        ]
      }
    ]
  },
  "allowed_reads": {
    "nodes": [
      "ln.*",
      "app.*",
      "paymentmethod.external_id"
    ]
  }
}

Request to create a CIQ Policy configuration using REST.

POST https://eu.api.indykite.com/configs/v1/authorization-policiesJson
{
  "project_id": "your_project_gid",
  "description": "description of policy",
  "display_name": "policy name",
  "name": "policy-name",
  "policy": "{\"meta\":{\"policy_version\":\"1.0-ciq\"},\"subject\":{\"type\":\"_Application\"},\"condition\":{\"cypher\":\"MATCH (subject:_Application) MATCH (app:Application)-[:USES]->(consentpayment:ConsentPayment)<-[:GRANTED]-(person:Person)-[:HAS]->(paymentmethod:PaymentMethod) MATCH (person)-[:IS_MEMBER]->(loyalty:Loyalty) MATCH (person)-[:OWNS]->(car:Car)-[:HAS]->(ln:LicenseNumber)\",\"filter\":[{\"operator\":\"AND\",\"operands\":[{\"attribute\":\"app.external_id\",\"operator\":\"=\",\"value\":\"$app_external_id\"},{\"attribute\":\"subject.external_id\",\"operator\":\"=\",\"value\":\"$_appId\"}]}]},\"allowed_reads\":{\"nodes\":[\"ln.*\",\"app.*\",\"paymentmethod.external_id\"]}}",
  "status": "ACTIVE",
  "tags": []
}

Request to read the CIQ Policy configuration using REST.

policy_request.jsonJson
{
  "id": "your_policy_configuration_gid"
}

Step 3

Create a CIQ Query in the context of the policy to retrieve the data.

knowledge_query.jsonJson
{
  "nodes": [
    "paymentmethod.external_id"
  ],
  "filter": {
    "attribute": "ln.property.number",
    "operator": "=",
    "value": "$license"
  }
}

Request to create a CIQ Query configuration using REST.

POST https://eu.api.indykite.com/configs/v1/knowledge-queriesJson
{
  "project_id": "your_project_gid",
  "description": "description of knowledge query",
  "display_name": "knowledge query name",
  "name": "knowledge-query-name",
  "policy_id": "your_policy_gid",
  "query": "{\"nodes\":[\"paymentmethod.external_id\"],\"filter\":{\"attribute\":\"ln.property.number\",\"operator\":\"=\",\"value\":\"$license\"}}",
  "status": "ACTIVE"
}

Read the Knowledge query Configuration.

GET https://eu.api.indykite.com/configs/v1/knowledge-queries/{id}Json
{
  "id": "your_knowledge_query_configuration_gid"
}

Step 4

CIQ Execution request.

POST https://eu.api.indykite.com/contx-iq/v1/executeJson
{
  "id": "knowledge_query_gid",
  "input_params": {
    "license": "AL98745",
    "app_external_id": "applicationParking"
  }
}

CIQ Eecution response.

response.jsonJson
{
  "data": [
    {
      "nodes": {
        "paymentmethod.external_id": "cb2563"
      }
    }
  ]
}

Step 5

Delete the CIQ Query.

DELETE https://eu.api.indykite.com/configs/v1/knowledge-queries/{id}Json
{
  "id": "your_knowledge_query_configuration_gid"
}

Delete the CIQ Policy.

DELETE https://eu.api.indykite.com/configs/v1/authorization-policies/{id}Json
{
  "id": "your_policy_configuration_gid"
}