public async Task <ActionResult> Index()
        {
            List <Condition> conditions = new List <Condition>();

            var query = @"
                g.V()
                    .hasLabel('condition')
                            .project('name', 'id')
                                .by('name')
                                .by('id')
            ";

            var results = await GremlinService.ExecuteGremlinQueryAsync(query);

            if (results.Any())
            {
                foreach (var result in results)
                {
                    string id        = result.id;
                    string condition = result.name;

                    conditions.Add(new Condition()
                    {
                        Id = id, Name = condition
                    });
                }
            }

            return(View(conditions));
        }
        public async Task <ActionResult> Details(string conditionId)
        {
            var query = @"
                g.V('{0}')
                    .project('name', 'id', 'symptoms', 'complications')
                        .by('name')
                        .by('id')
                        .by(inE('symptom').outV().project('name', 'id').by('name').by('id').fold())
                        .by(
                            union(
                                outE('complicates').inV().project('name').by('name').fold(),
                                inE('complicates').outV().project('name').by('name').fold()
                            )
                        )
            ";

            query = string.Format(query, conditionId);

            var results = await GremlinService.ExecuteGremlinQueryAsync(string.Format(query, conditionId));

            if (results.Any())
            {
                foreach (var result in results)
                {
                    string name = result.name;
                    string id   = result.id;

                    IEnumerable <string>  complications = ((IEnumerable <dynamic>)result.complications).Select(wb => (string)wb.name);
                    IEnumerable <Symptom> symptoms      = ((IEnumerable <dynamic>)result.symptoms).Select(wb => new Symptom()
                    {
                        Name = wb.name, Id = wb.id
                    });

                    ConditionDetails details = new ConditionDetails()
                    {
                        ConditionName = name,
                        Symptoms      = symptoms,
                        Complications = complications
                    };

                    if (Request.AcceptTypes.Contains("application/json"))
                    {
                        return(Json(details, JsonRequestBehavior.AllowGet));
                    }
                    else
                    {
                        return(View(details));
                    }
                }
            }

            return(HttpNotFound());
        }
        public async Task <ActionResult> Edit(string id)
        {
            var query = $"g.V('{id}').project('name', 'id').by('name').by('id')";

            var results = await GremlinService.ExecuteGremlinQueryAsync(query);

            if (results.Any())
            {
                foreach (var result in results)
                {
                    Condition condition = new Condition()
                    {
                        Name = result.name,
                        Id   = result.id
                    };

                    return(View(condition));
                }
            }

            return(HttpNotFound());
        }
        private static async Task <List <ConditionComplication> > GetConditionComplicationsByWeatherAsync(string weatherCondition)
        {
            List <ConditionComplication> conditions = new List <ConditionComplication>();

            //TODO: Use a graph Db to query all conditions which have specified weather as a symptom
            //Or cold weather as a symptom.

            var query = @"
                g.V()
                    .hasLabel('weather')
                    .has('name', '{0}')
                        .outE('complicates')
                        .inV()
                        .hasLabel('condition')
                            .project('condition', 'id', 'suggestions')
                                .by('name')
                                .by('id')
                                .by(inE().values('suggestions'))
            ";


            var results = await GremlinService.ExecuteGremlinQueryAsync(string.Format(query, weatherCondition));

            if (results.Any())
            {
                foreach (var result in results)
                {
                    string suggestions = result.suggestions;
                    string condition   = result.condition;

                    conditions.Add(new ConditionComplication((string)result.id, condition, suggestions.Split(new string[] { "|" }, StringSplitOptions.RemoveEmptyEntries).AsEnumerable()));
                }
            }

            return(conditions);
        }