public static void StoreSimilarity(MyDatabase mydb, int artist1_id, int artist2_id, double similarity)
 {
     mydb.newQuery("INSERT INTO ArtistSimilarity VALUES(@artist1_id, @artist2_id, @similarity)");
     mydb.setParameter("artist1_id", artist1_id);
     mydb.setParameter("artist2_id", artist2_id);
     mydb.setParameter("similarity", similarity);
     mydb.ExecuteNonQuery();
 }
    public static Dictionary<int, double> CalculateSimilarities(MyDatabase mydb, ArtistInfo Artist, 
        bool batchMode = false, List<ArtistInfo> prevArtists = null)
    {
        if (!batchMode)
        {
            mydb.newQuery("DELETE FROM ArtistSimilarity WHERE artist1_id=@artist_id OR artist2_id=@artist_id");
            mydb.setParameter("artist_id", Artist.ArtistId);
            mydb.ExecuteNonQuery();
        }

        Dictionary<String, int> similarArtists = new Dictionary<string, int>();

        GetEchonestData(similarArtists, Artist.ArtistName);
        GetLastFMData(similarArtists, Artist.ArtistName);
        GetYahooData(similarArtists, Artist.ArtistName);

        if (!batchMode)
            prevArtists = GetArtists(mydb, Artist.ArtistId);

        Dictionary<int, double> similarityNumerator = new Dictionary<int, double>();
        Dictionary<int, double> similarityDenominator = new Dictionary<int, double>();
        Dictionary<int, double> similarity = new Dictionary<int, double>();
        for (int i = 0; i < prevArtists.Count; ++i)
        {
            similarityNumerator.Add(prevArtists[i].ArtistId, 0);
            similarityDenominator.Add(prevArtists[i].ArtistId, 0);

            if (!similarArtists.ContainsKey(prevArtists[i].ArtistName))
                similarity.Add(prevArtists[i].ArtistId, 0);
            else
                similarity.Add(prevArtists[i].ArtistId,
                    initialSimilarity(similarArtists[prevArtists[i].ArtistName]));
        }

        foreach (KeyValuePair<string, int> entry in similarArtists)
        {
            double weight = initialSimilarity(entry.Value);
            weight *= weight;

            mydb.newQuery("SELECT s.artist2_id, s.similarity FROM Artist a, ArtistSimilarity s" +
                " WHERE s.artist1_id = a.artist_id AND a.artist_name=@artist_name AND s.artist2_id!=@artist_id");
            mydb.setParameter("artist_name", entry.Key);
            mydb.setParameter("artist_id", Artist.ArtistId);
            SqlDataReader reader = mydb.ExecuteReader();

            while (reader.Read())
            {
                int artistId = Int32.Parse(reader["artist2_id"].ToString());
                double sim = Double.Parse(reader["similarity"].ToString());

                similarityNumerator[artistId] += sim * weight;
                similarityDenominator[artistId] += weight;
            }
        }

        for (int i = 0; i < prevArtists.Count; ++i)
        {
            int id = prevArtists[i].ArtistId;
            similarity[id] += transitiveSimilarity(similarity[id], similarityNumerator[id], similarityDenominator[id]);
        }

        for (int i = 0; i < prevArtists.Count; ++i)
        {
            StoreSimilarity(mydb, Artist.ArtistId, prevArtists[i].ArtistId, similarity[prevArtists[i].ArtistId]);
            StoreSimilarity(mydb, prevArtists[i].ArtistId, Artist.ArtistId, similarity[prevArtists[i].ArtistId]);
        }
        StoreSimilarity(mydb, Artist.ArtistId, Artist.ArtistId, 1);

        return similarity;
    }
    public static List<ArtistInfo> GetArtists(MyDatabase mydb, int ArtistId)
    {
        List<ArtistInfo> artists = new List<ArtistInfo>();

        mydb.newQuery("SELECT artist_id, artist_name from Artist WHERE artist_id != @artist_id");
        mydb.setParameter("artist_id", ArtistId);
        SqlDataReader reader = mydb.ExecuteReader();

        while (reader.Read())
        {
            int artistId = Int32.Parse(reader["artist_id"].ToString());
            string artistName = reader["artist_name"].ToString();

            artists.Add(new ArtistInfo(artistId, artistName));
        }

        return artists;
    }