SQL Server數(shù)據(jù)挖掘規(guī)則實現(xiàn)商品推薦2
此篇在上一篇已經(jīng)構(gòu)建好挖掘模型的基礎(chǔ)之上,介紹如何構(gòu)建服務(wù)接口。
編寫服務(wù)接口的方法很多,比如使用WCF。為了簡便,這里直接使用ASP.NET Web Services。
將挖掘模型的具體查詢的實現(xiàn)部分寫到Web服務(wù)代碼中,主要是考慮到代碼分層降低耦合性。另外這部分邏輯通過服務(wù)的方式來暴露接口,可以方便其它任何平臺來進(jìn)行調(diào)用,比如ASP.NET, Winform, WPF或者其它基于java的技術(shù)框架等。Web服務(wù)最主要的部分是XML,一個服務(wù)接口往往就是一個URL地址,客戶端程序通過向這個地址發(fā)送xml請求的方式,來獲取服務(wù)端代碼的響應(yīng),結(jié)果再以xml的方式返回回來。那么既然來回通信的都是xml數(shù)據(jù),是否意味這還要手動寫代碼來序列化和反序列化xml數(shù)據(jù)呢?這里面又涉及到一個SOAP的概念,這是一個在10年前很火的概念,簡單對象訪問協(xié)議。通過這個SOAP協(xié)議,客戶端程序可以知道要訪問一個Web服務(wù),應(yīng)該發(fā)送什么樣的xml數(shù)據(jù),以及收到服務(wù)端xml的數(shù)據(jù)之后,本地再如何解析這些數(shù)據(jù)?;谶@樣一個方式,Visual Studio中,當(dāng)你引用一個服務(wù)的時候,它就會根據(jù)這個協(xié)議,在你本地生成若干代理類,這樣在你調(diào)用遠(yuǎn)程的一個Web服務(wù)的時候,你就會感覺像是在調(diào)用本地里的一個類的方法一樣方便。
筆者注:如果你用Winform和ASP.NET等,那么你也可以選擇直接在代碼里訪問挖掘模型的數(shù)據(jù),但是如果是其它平臺,比如Win 8 App, silverlight和flash等,它們是無法直接和數(shù)據(jù)源進(jìn)行通信的,所以只能通過服務(wù)的方法來訪問。
本篇就是要編寫這樣一個服務(wù)接口,這個服務(wù)接受客戶已經(jīng)購買的商品列表信息,然后根據(jù)這些信息來向用戶推薦其它商品。
服務(wù)的核心邏輯是根據(jù)傳送過來的商品列表,來動態(tài)的去拼DMX語句。在上一篇中提到的那個DMX語句,這里主要以它為"模版"。
根據(jù)上一篇的講解,我們知道需要變化的就是SELECT UNION SELECT的部分,一條商品對應(yīng)一個SELECT。
還有一個需要介紹的東西是ADOMD.NET,這個名字你看上去可能感覺有些面熟,沒錯,你肯定用過ADO.NET,還記得經(jīng)典方式操作數(shù)據(jù)庫的步驟嗎?新建Connection, Command然后DataReader或者其它方式來接收數(shù)據(jù)。ADOMD.NET就是專門用來訪問分析服務(wù)用的,由于它跟ADO.NET一樣都集成自同一接口,所以你可以找到熟悉的Connection和Command對象,而接收對象的除了DataReader外,還有跟DataSet相對應(yīng)的CellSet對象。
傳統(tǒng)的分析服務(wù)是包含多維模型和數(shù)據(jù)挖掘的,所以在ADOMD.NET下,可以拋MDX(查多維數(shù)據(jù)集用的)和DMX(查挖掘模型用的)。這里我們用的數(shù)據(jù)訪問接口就是ADOMD.NET。
- SELECT FLATTENED
- PredictAssociation([Association].[v Assoc Seq Line Items],INCLUDE_STATISTICS,3)
- FROM
- [Association]
- NATURAL PREDICTION JOIN
- (
- SELECT (SELECT 'Touring Tire' AS [Model]
- UNION
- SELECT 'Touring Tire Tube' AS [Model]
- ) AS [v Assoc Seq Line Items]) AS t
確認(rèn)好以上邏輯之后,我們開始構(gòu)建Web服務(wù)。
這里我們使用Visual Studio 2012來編寫服務(wù)。跟上一篇不同,上一篇為了編寫一個SQL Server 2012的分析服務(wù)項目,我們用的是SQL Server Data Tools,這個實際上就是Visual Studio 2010的一個Shell。而那個地方為什么用的版本是2010而不是2012?這里面有一個SQL Server和Visual Studio版本的一個對應(yīng)的關(guān)系。
SQL Server版本 |
對應(yīng)的Visual Studio Shell版本 |
2000 |
無 |
2005 |
2005 |
2008 |
2008 |
2012 |
2010 |
2012的下一個版本 |
2012 |
可以看到主要還是根據(jù)兩個產(chǎn)品系列的版本發(fā)布有關(guān)系。所以這里就有一個地方需要留意,如果你的機(jī)器上同時安裝了Visual Studio 2012和SQL Server 2012,那么當(dāng)你打開一個類似上一篇中建立的分析服務(wù)項目的時候,不要默認(rèn)雙擊打開項目文件,因為系統(tǒng)會用Visual Studio 2012 (不是應(yīng)該與其對應(yīng)的2010)來打開你的項目,然后提示你將項目升級到2012。不用想,對應(yīng)Visual Studio 2012 Shell的SQL Server版本還沒發(fā)布呢,所以即使升級了最后也一定是失敗。
下面言歸正傳,打開Visual Studio 2012。點擊菜單欄FILE->New Project。
項目類型選擇ASP.NET Empty Web Application。
點擊OK新建一個新ASP.NET項目。
在Solution Explorer中,右鍵項目名稱,點Add->New Item。
在Add New Item中,選擇Web Service。然后點Add。
然后可以看到系統(tǒng)自動生成的測試用的服務(wù)代碼。
下面首先添加ADOMD.NET引用。右鍵項目目錄,選擇Add Reference。
ADOMD.NET組件不會默認(rèn)出現(xiàn)在這里。需要點擊Browse手動去找。
通常ADOMD.NET組件的位置是位于這個目錄下:
C:\Program Files\Microsoft.NET\ADOMD.NET\110
找到Microsoft.AnalysisServices.AdomdClient.dll,點OK。
可以看到ADOMD.NET組件已經(jīng)被添加到引用目錄下。
然后,回到Web服務(wù)代碼界面,在代碼中using這個庫的引用。
然后為服務(wù)編寫代碼,首先定義一個類,服務(wù)的結(jié)果將以這個類的結(jié)構(gòu)返回。
- public class ModelResult
- {
- public string ModelName { get; set; }
- public double Support { get; set; }
- public double Probility { get; set; }
- }
定義好這個類之后,再編寫服務(wù)代碼,這里直接貼出來:
- [WebMethod]
- public List<ModelResult> GetModelResult(List<string> ModelList)
- {
- List<ModelResult> result = new List<ModelResult>();
- bool FirstOne = true;
- //Build DMX query
- StringBuilder sb = new StringBuilder();
- sb.AppendLine("SELECT FLATTENED");
- sb.AppendLine("PredictAssociation([Association].[v Assoc Seq Line Items],INCLUDE_STATISTICS,3)");
- sb.AppendLine("FROM");
- sb.AppendLine("[Association]");
- sb.AppendLine("NATURAL PREDICTION JOIN");
- sb.AppendLine("(");
- foreach (string item in ModelList)
- {
- if (FirstOne == true)
- {
- sb.AppendLine("SELECT (SELECT '" + item + "' AS [Model]");
- FirstOne = false;
- }
- else
- {
- sb.AppendLine("UNION");
- sb.AppendLine("SELECT '" + item + "' AS [Model]");
- }
- }
- sb.AppendLine(") AS [v Assoc Seq Line Items]) AS t");
- AdomdConnection conn = new AdomdConnection();
- conn.ConnectionString = "Provider=MSOLAP.3;Integrated Security=SSPI;Persist Security Info=True;Initial Catalog=MultidimensionalProject1;Data Source=.";
- conn.Open();
- AdomdCommand comm = new AdomdCommand(sb.ToString(), conn);
- AdomdDataReader dr = comm.ExecuteReader();
- //Read result
- while (dr.Read())
- {
- ModelResult mr = new ModelResult();
- mr.ModelName = dr[0].ToString();
- mr.Support = Convert.ToDouble(dr[1]);
- mr.Probility = Convert.ToDouble(dr[2]);
- result.Add(mr);
- }
- conn.Close();
- return result;
- }
留意貼出的這段代碼第一行,有一個[WebMethod],Web服務(wù)的方法跟一個類的傳統(tǒng)方法區(qū)別就在這里,只有在方法前面打上這個標(biāo)記才會被系統(tǒng)認(rèn)為是一個Web服務(wù)方法發(fā)布出去。
代碼中先根據(jù)上一篇提到的DMX語句的查詢"模版",中簡通過一個foreach循環(huán)來動態(tài)構(gòu)建SELECT UNION SELECT部分。最后通過Connection和Command對象以及DataReader方法來讀取結(jié)果,并且把其加載到類里。
然后,為了方便測試,再加一個測試服務(wù)方法:
- [WebMethod]
- public List<ModelResult> GetModelResultTest(string ModelSingle)
- {
- List<string> ModelList = new List<string>();
- ModelList.Add(ModelSingle);
- return GetModelResult(ModelList);
- }
這個方法實際上還是調(diào)用了剛才建立的服務(wù)方法,只不過它只傳遞了一個商品過來,在這里打包成一個List后丟掉那個方法里。
這樣,在ASP.NET自帶的服務(wù)瀏覽界面中就可以測試我們剛才編寫的方法了。右鍵asmx文件點View in Browser。
然后可以看到系統(tǒng)自動為服務(wù)建立的簡單測試頁面。
這里點擊GetModelResultTest方法。
在參數(shù)值中輸入'Touring Tire',點"調(diào)用"。
最后,就可以看到服務(wù)返回的結(jié)果信息。信息的格式是通過xml的,你無需去解析它,通過前面提到的SOAP協(xié)議,系統(tǒng)會為你建立相應(yīng)的本地代理類。
至此,為挖掘模型編寫的服務(wù)層代碼就編寫完畢了。下一篇將建立一個應(yīng)用程序來調(diào)用這個服務(wù)從而實現(xiàn)一個簡單的商品推薦功能。
原文鏈接:http://www.cnblogs.com/aspnetx/archive/2013/02/24/2924091.html
【編輯推薦】