private QueryResponse ExecuteQuery(string query)
        {
            lock (this.@lock)
            {
                var stream = this.Client.GetStream();

                this.SendMessage(stream, query);

                var responseJson = JObject.Parse(this.ReceiveMessage(stream));

                if (responseJson.ContainsKey("error"))
                {
                    throw new InvalidDataException(responseJson["error"].ToString());
                }

                return(QueryResponse.FromJson(responseJson));
            }
        }