private async Task <IdentityResult> AddRollupAsync(
            Neo4jIdentityServer4ApiResource apiResource,
            ApiResourceRollup rollup,
            CancellationToken cancellationToken = default(CancellationToken))
        {
            cancellationToken.ThrowIfCancellationRequested();
            ThrowIfDisposed();
            apiResource.ThrowIfNull(nameof(apiResource));
            rollup.ThrowIfNull(nameof(rollup));

            try
            {
                var cypher = $@"
                    MATCH (c:{IdSrv4ApiResource}{{Name: $p0}})        
                    MERGE (rollup:{IdSrv4ApiResourceRollup} {"$p1".AsMapForNoNull<ApiResourceRollup>(rollup)})
                    MERGE (c)-[:{Neo4jConstants.Relationships.HasRollup}]->(rollup)";

                var result = await Session.RunAsync(cypher, Params.Create(apiResource.Name, rollup));

                return(IdentityResult.Success);
            }
            catch (ClientException ex)
            {
                return(ex.ToIdentityResult());
            }
        }
        public async Task <ApiResource> RollupAsync(
            Neo4jIdentityServer4ApiResource apiResource,
            CancellationToken cancellationToken = default(CancellationToken))
        {
            cancellationToken.ThrowIfCancellationRequested();
            ThrowIfDisposed();
            apiResource.ThrowIfNull(nameof(apiResource));
            var foundApiResource = await GetApiResourceAsync(apiResource, cancellationToken);

            ApiResource model = null;

            if (foundApiResource != null)
            {
                model = foundApiResource.ToModel();
                var secrets = await GetApiSecretsAsync(apiResource, cancellationToken);

                foreach (var secret in secrets)
                {
                    model.ApiSecrets.Add(secret.ToModel());
                }

                var claims = await GetApiResourceClaimsAsync(apiResource, cancellationToken);

                foreach (var claim in claims)
                {
                    model.UserClaims.Add(claim.Type);
                }

                var apiScopes = await GetApiScopesAsync(apiResource, cancellationToken);

                foreach (var apiScope in apiScopes)
                {
                    var apiScopeModel = await GetRollupAsync(apiResource, apiScope, cancellationToken);

                    model.Scopes.Add(apiScopeModel);
                }

                var distinctList = model.Scopes.Distinct(new ModelsScopeComparer());
                model.Scopes = distinctList.ToList();

                var rollup = new ApiResourceRollup()
                {
                    ApiResourceJson = JsonConvert.SerializeObject(model),
                };
                await AddRollupAsync(apiResource, rollup);
            }


            return(model);
        }