/// <summary>
        /// Gets a list of key value pairs listing Similar Individuals and their Similarity scores
        /// </summary>
        /// <param name="number">Number of Similar Individuals</param>
        /// <param name="individual">QName of a Individual to find Similar Individuals to</param>
        /// <param name="callback">Callback to invoke when the operation completes</param>
        /// <param name="state">State to pass to the callback</param>
        public void Similarity(int number, String individual, PelletSimilarityServiceCallback callback, Object state)
        {
            this.SimilarityRaw(number, individual, (g, _) =>
            {
                List <KeyValuePair <INode, double> > similarities = new List <KeyValuePair <INode, double> >();

                SparqlParameterizedString query = new SparqlParameterizedString();
                query.Namespaces  = g.NamespaceMap;
                query.CommandText = "SELECT ?ind ?similarity WHERE { ?s cp:isSimilarTo ?ind ; cp:similarityValue ?similarity }";

                Object results = g.ExecuteQuery(query);
                if (results is SparqlResultSet)
                {
                    foreach (SparqlResult r in (SparqlResultSet)results)
                    {
                        if (r["similarity"].NodeType == NodeType.Literal)
                        {
                            similarities.Add(new KeyValuePair <INode, double>(r["ind"], Convert.ToDouble(((ILiteralNode)r["similarity"]).Value)));
                        }
                    }

                    callback(similarities, state);
                }
                else
                {
                    throw new RdfReasoningException("Unable to extract the Similarity Information from the Similarity Graph returned by Pellet Server");
                }
            }, null);
        }
        /// <summary>
        /// Gets a list of key value pairs listing Similar Individuals and their Similarity scores
        /// </summary>
        /// <param name="number">Number of Similar Individuals</param>
        /// <param name="individual">QName of a Individual to find Similar Individuals to</param>
        /// <param name="callback">Callback to invoke when the operation completes</param>
        /// <param name="state">State to pass to the callback</param>
        public void Similarity(int number, String individual, PelletSimilarityServiceCallback callback, Object state)
        {
            this.SimilarityRaw(number, individual, (g, _) =>
                {
                    List<KeyValuePair<INode, double>> similarities = new List<KeyValuePair<INode, double>>();

                    SparqlParameterizedString query = new SparqlParameterizedString();
                    query.Namespaces = g.NamespaceMap;
                    query.CommandText = "SELECT ?ind ?similarity WHERE { ?s cp:isSimilarTo ?ind ; cp:similarityValue ?similarity }";

                    Object results = g.ExecuteQuery(query);
                    if (results is SparqlResultSet)
                    {
                        foreach (SparqlResult r in (SparqlResultSet)results)
                        {
                            if (r["similarity"].NodeType == NodeType.Literal)
                            {
                                similarities.Add(new KeyValuePair<INode, double>(r["ind"], Convert.ToDouble(((ILiteralNode)r["similarity"]).Value)));
                            }
                        }

                        callback(similarities, state);
                    }
                    else
                    {
                        throw new RdfReasoningException("Unable to extract the Similarity Information from the Similarity Graph returned by Pellet Server");
                    }
            }, null);
        }