使用SQL Server Analysis Services数据挖掘的关联规则实现商品推荐功能(七)
假如你有一个购物类的网站,那么你如何给你的客户来推荐产品呢?这个功能在很多电商类网站都有,那么,通过SQL Server Analysis Services的数据挖掘功能,你也可以轻松的来构建类似的功能。
上一篇中介绍的是如何通过DMX来创建挖掘模型,这一篇讲简单介绍如何通过编程的方式来创建挖掘模型。
通过编程的方式主要通过AMO来实现,分析服务的所有跟架构相关的实现,包括多维数据集和数据挖掘,都通过这个接口实现。
AMO对象树包含了支持多维数据集和数据挖掘所有的对象模型,在我这篇随笔中可以详细看到它的结构。
对象的结构稍微复杂一些,但我们关注的有三个部分:

通过这两个对象连接到分析服务数据库并且操作分析服务数据库实例。

然后通过DataSource以及DataSourceView创建数据源连接和数据源视图。

然后通过MiningStructrue下的对象体系和MiningModel来创建挖掘结构和挖掘模型,可以留意到Column是自包含的结构,这主要是考虑到了挖掘结构中的嵌套模型。
通过以上的对象模型我们可以观察到,这些对象跟我们在Visual Studio中创建一个数据挖掘项目都是相对应的,在一个正常的过程中我们都会按照下面的套路进行操作:
- 创建项目(实际上部署之后对应的就是一个数据库)
- 创建数据源
- 创建数据源视图
- 创建挖掘结构(定义数据结构)
- 创建挖掘模型(挖掘算法等)
以下将简单演示如何通过AMO来创建数据挖掘项目。
打开Visual Studio,此篇用到的版本是2010,对应的数据库是SQL Server 2012。在Visual Studio中创建一个控制台项目,然后右键单击References文件夹,选择Add Reference…

点击Browse找到AMO对象所对应的dll文件。

这个文件通常在如下的位置:
C:\Program Files (x86)\Microsoft SQL Server\110\SDK\Assemblies
接下来回到控制台代码中,首先需要加入AMO对象的引用。
using Microsoft.AnalysisServices;
然后,通过如下的代码连接到分析服务实例。
Server SSASServer = new Server();
SSASServer.Connect(@".");
创建分析服务数据库。
#region Create database
string strDataBaseName = "DMAMO";
Console.WriteLine("Check database: " + strDataBaseName);
if (SSASServer.Databases.Contains(strDataBaseName))
{
SSASServer.Databases.Remove(strDataBaseName);
Console.WriteLine("Database " + strDataBaseName + " already exists, droped.");
}
Database db = new Database(strDataBaseName, strDataBaseName);
SSASServer.Databases.Add(db);
db.Update();
#endregion

上面代码运行完毕后,会看到在对应的分析服务实例下已经创建了一个空的数据库。
创建数据源。
#region DataSource
RelationalDataSource rds = new RelationalDataSource("DMDataSource", Utils.GetSyntacticallyValidID("DMDataSource", typeof(Database)));
rds.ConnectionString = @"Data Source=.;Initial Catalog=AdventureWorksDW2012;Provider=SQLNCLI11.1;Integrated Security=SSPI;Application Name=SSASDEMO;";
rds.ImpersonationInfo = new ImpersonationInfo("wade", "iamfromcnblogs");
db.DataSources.Add(rds);
db.Update(UpdateOptions.ExpandFull);
#endregion

留意到数据源对象的ImpersonationInfo属性,它的设置对应如下图的设置。在本机开发的时候,为了方便我们通常将其设置成为一个管理员账号。

创建数据源视图。
#region Data Source View
DataSet dset = new DataSet();
SqlConnection sqlconn = new SqlConnection(@"Data Source=.;Initial Catalog=AdventureWorksDW2012;Integrated Security=SSPI;Application Name=SSASDEMO;");
//Line Items
SqlDataAdapter daLineItems = new SqlDataAdapter("SELECT [OrderNumber],[LineNumber],[Model] FROM [vAssocSeqLineItems]", sqlconn);
daLineItems.FillSchema(dset, SchemaType.Mapped, "vAssocSeqLineItems");
dset.Tables["vAssocSeqLineItems"].ExtendedProperties.Add("TableType", "View");
//Orders
SqlDataAdapter daOrders = new SqlDataAdapter("SELECT [OrderNumber],[CustomerKey],[Region],[IncomeGroup] FROM [vAssocSeqOrders]", sqlconn);
daOrders.FillSchema(dset, SchemaType.Mapped, "vAssocSeqOrders");
dset.Tables["vAssocSeqOrders"].ExtendedProperties.Add("TableType", "View");
//Relationship
DataRelation relateProductSubCate = new DataRelation("Rel", dset.Tables["vAssocSeqOrders"].Columns["OrderNumber"], dset.Tables["vAssocSeqLineItems"].Columns["OrderNumber"]);
dset.Relations.Add(relateProductSubCate);
DataSourceView dsv = new DataSourceView("DMDSV", "DMDSV");
dsv.DataSourceID = "DMDataSource";
dsv.Schema = dset.Clone();
db.DataSourceViews.Add(dsv);
db.Update(UpdateOptions.ExpandFull);
#endregion

创建数据源视图是一个比较复杂的过程,表需要对应一个一个的对象,而且关系也要一一创建,最后需要把用到的表都通过DataSet对象加载进来,然后再通过clone方法将其设置成数据源视图的架构。

创建挖掘结构。
#region Mining Structure
MiningStructure ms = new MiningStructure("MSOrder", "MSOrder");
db.MiningStructures.Add(ms);
ms.Source = new DataSourceViewBinding("DMDSV");
ScalarMiningStructureColumn scOrderNumber = ms.Columns.Add("OrderNumber", "OrderNumber");
scOrderNumber.IsKey = true;
scOrderNumber.Type = MiningStructureColumnTypes.Text;
scOrderNumber.Content = MiningStructureColumnContents.Key;
scOrderNumber.KeyColumns.Add("vAssocSeqOrders", "OrderNumber", OleDbType.WChar);
ScalarMiningStructureColumn scModel = ms.Columns.Add("Model", "Model");
scModel.IsKey = true;
scModel.Type = MiningStructureColumnTypes.Text;
scModel.Content = MiningStructureColumnContents.Key;
scModel.KeyColumns.Add("vAssocSeqLineItems", "Model", OleDbType.WChar);
TableMiningStructureColumn tcLineItems = new TableMiningStructureColumn("SeqLineitems", "SeqLineitems");
tcLineItems.ForeignKeyColumns.Add("vAssocSeqLineItems", "OrderNumber");
tcLineItems.Columns.Add(scModel);
ms.Columns.Add(tcLineItems);
ms.Update();
#endregion

挖掘结构的创建实际上也是把数据源视图中定义的架构映射成数据挖掘结构的一个过程。需要通过对应的MiningColumn对象根据数据源视图把需要用到的字段映射进来。
创建挖掘模型,其中通过枚举属性Algorithm来设置挖掘模型根据挖掘结构采用的是哪种挖掘算法。
#region Mining Model
MiningModel mm = ms.CreateMiningModel(true, "Basket Forecasting Model");
mm.Algorithm = MiningModelAlgorithms.MicrosoftAssociationRules;
mm.Columns["SeqLineitems"].Usage = MiningModelColumnUsages.Predict;
mm.Update();
#endregion

一个挖掘模型对应一个挖掘结构,所以很多结构直接继承了挖掘结构。这里唯一需要做的就是,根据创建出来的挖掘模型,将其中的一个列设置成预测字段。
最后,通过AMO处理挖掘模型。
#region Process
SSASServer.CaptureXml = true;
db.Process();
SSASServer.CaptureXml = false;
Console.WriteLine("Processing...");
SSASServer.ExecuteCaptureLog(true, true);
#endregion
打开挖掘模型,可以看到挖掘模型生成的规则。

当然,实际上在代码中来创建挖掘模型是不被推荐的,有些AMO的深层对象模型目前SQL Server的文档里只能提供接口描述而没有关于模型的介绍和讲解,笔者主要是根据项目里创建的过程然后再回过头来理解对象模型的含义,而即使国外网站上关于挖掘结构和模型中的嵌套结构更是少之又少,所以这篇真的是摸索了好久,不断的编译调试和对比才将各个细节打通。无论如何,通过这个过程我们可以更深入的了解分析服务底层的对象模型从而更好地去理解和设计我们的挖掘模型,同时也可以通过AMO自动地去调整模型。希望通过此篇,会让更多的朋友来了解AMO对象模型。
使用SQL Server Analysis Services数据挖掘的关联规则实现商品推荐功能(七)的更多相关文章
- SQL Server Analysis Services 数据挖掘
假如你有一个购物类的网站,那么你如何给你的客户来推荐产品呢?这个功能在很多 电商类网站都有,那么,通过SQL Server Analysis Services的数据挖掘功能,你也可以轻松的来构建类似的 ...
- SQL Server Analysis Services 数据挖掘(1)
来源: http://technet.microsoft.com/zh-cn/library/dn633476.aspx 假如你有一个购物类的网站,那么你如何给你的客户来推荐产品呢?这个功能在很多 电 ...
- SQL Server Analysis Services SSAS Processing Error Configurations
转载:https://www.mssqltips.com/sqlservertip/3476/sql-server-analysis-services-ssas-processing-error-co ...
- 全半角空格导致的Sql Server Analysis Services处理错误(转载)
问题描述 某维度表的字符串列同时出现两条记录,A记录以半角空格(英文空格)结束,B记录以全角空格(中文空格)结束,除此之外其他部分均相同.Analysis Service处理的时候抛出“Key not ...
- 微软Sql server analysis service数据挖掘技术
最新在一个项目中要求用到微软SSAS中的数据挖掘功能,虽然以前做项目的时候也经常用到SSAS中的多维数据集 (就是CUBE),但是始终没有对SSAS中的数据挖掘功能进行过了解.所以借着项目需求这股东风 ...
- Sql Server Analysis Service 处理时找到重复的属性键、找不到属性键错误(转载)
这是两个非常常见的SSAS处理异常,网上也能找到很多文章讲解决办法,但很少见关于异常原因的分析,先来看看第一个" OLAP 存储引擎中存在错误: 处理时找到重复的属性键",一个维度 ...
- SQL Server Reporting Services本机模式下的权限管理
SQL Server Reporting Services在安装配置后,缺省只给BUILTIN\Administrators用户组(实际上只有本机的Administrator用户)提供管理权限.所以所 ...
- SrsDataConnector The SQL Server Reporting Services account is a local user and is not supported.
这次使用OS+SQL的镜像还原系统后安装了CRM 2015,主要流程是 安装IIS/AD,SSRS ,CRM2015.自带的SQL中SSRS没有安装完全,需配置一下. 这一切都满顺利的,最后在安装 S ...
- 充分利用 SQL Server Reporting Services 图表
最近在查SSRS的一些文章,看到MSDN在有一篇不错的文章,许多图表设置都有说明,共享给大家.. 其中有说明在SSRS中如果去写条件表达写和报表属性中的“自定义代码”,文章相对比较长,需要大家耐心的查 ...
随机推荐
- .net项目在linux平台的CI流程(基于Jenkins+mono+jexus)
内容较多,主要分为以下4方面内容: Jenkins的安装部署(centos 7+) .net在linux平台CI流程所需的插件管理&配置 Jenkins配置连接Gitlab(也可使用对应插件连 ...
- CSS div水平垂直居中和div置于底部
一.水平居中 .hor_center { margin: 0 auto; } 二.水平垂直居中 .content { width: 360px; height: 240px; } .ver_hor_c ...
- 动态树之LCT(link-cut tree)讲解
动态树是一类要求维护森林的连通性的题的总称,这类问题要求维护某个点到根的某些数据,支持树的切分,合并,以及对子树的某些操作.其中解决这一问题的某些简化版(不包括对子树的操作)的基础数据结构就是LCT( ...
- JS Select 月日日期联动
Js对Select控件进行联动操作,一个select选择月份后另一个select生成对应月份的所有日期. <%@ Page Language="C#" AutoEventWi ...
- 配置samba
安装samba服务器之后,很方便的实现Windows和Linux进行通信. 安装步骤:1.在Ubuntu系统下面安装samba服务: nii@ww:~$ sudo apt-get install sa ...
- Oracle表格建立
Oracle学习第一天:学习了如何在网页上建立表空间,以及在关联性表格上建立表格,填充表格,学习了如何建立自己的表空间.效果如下:
- 第一次部署Struts2时出现错误java.lang.ClassNotFoundException: org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.class
报如下错误 at org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1720) at org. ...
- 【URLDecoder】java.lang.IllegalArgumentException: URLDecoder: Illegal hex characters in es
Java调用 URLDecoder.decode(str, "UTF-8"); 抛出以上的异常,其主要原因是% 在URL中是特殊字符,需要特殊转义一下, 上面的字符串中'%'是一个 ...
- 3、CCS样式表
一.CCS样式表的分类(优先级从低到高): 1.浏览器默认样式表 2.外部样式表:在外部创建的.ccs文件中.使用外部样式表可以使样式应用于多个网页.通过这个方法只需改动一个文件就能改变整个网站的外观 ...
- 摄像头拍照,PHP输入流php://input的使用分析
在做一个摄像头拍照然后上传的功能,php中使用php://input来获取内容.于是就了解了下php://input. 从官网信息来看,php://input是一个只读信息流,当请求方式是post的, ...