假如你有一个购物类的网站,那么你如何给你的客户来推荐产品呢?这个功能在很多电商类网站都有,那么,通过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数据挖掘的关联规则实现商品推荐功能(七)的更多相关文章

  1. SQL Server Analysis Services 数据挖掘

    假如你有一个购物类的网站,那么你如何给你的客户来推荐产品呢?这个功能在很多 电商类网站都有,那么,通过SQL Server Analysis Services的数据挖掘功能,你也可以轻松的来构建类似的 ...

  2. SQL Server Analysis Services 数据挖掘(1)

    来源: http://technet.microsoft.com/zh-cn/library/dn633476.aspx 假如你有一个购物类的网站,那么你如何给你的客户来推荐产品呢?这个功能在很多 电 ...

  3. SQL Server Analysis Services SSAS Processing Error Configurations

    转载:https://www.mssqltips.com/sqlservertip/3476/sql-server-analysis-services-ssas-processing-error-co ...

  4. 全半角空格导致的Sql Server Analysis Services处理错误(转载)

    问题描述 某维度表的字符串列同时出现两条记录,A记录以半角空格(英文空格)结束,B记录以全角空格(中文空格)结束,除此之外其他部分均相同.Analysis Service处理的时候抛出“Key not ...

  5. 微软Sql server analysis service数据挖掘技术

    最新在一个项目中要求用到微软SSAS中的数据挖掘功能,虽然以前做项目的时候也经常用到SSAS中的多维数据集 (就是CUBE),但是始终没有对SSAS中的数据挖掘功能进行过了解.所以借着项目需求这股东风 ...

  6. Sql Server Analysis Service 处理时找到重复的属性键、找不到属性键错误(转载)

    这是两个非常常见的SSAS处理异常,网上也能找到很多文章讲解决办法,但很少见关于异常原因的分析,先来看看第一个" OLAP 存储引擎中存在错误: 处理时找到重复的属性键",一个维度 ...

  7. SQL Server Reporting Services本机模式下的权限管理

    SQL Server Reporting Services在安装配置后,缺省只给BUILTIN\Administrators用户组(实际上只有本机的Administrator用户)提供管理权限.所以所 ...

  8. 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 ...

  9. 充分利用 SQL Server Reporting Services 图表

    最近在查SSRS的一些文章,看到MSDN在有一篇不错的文章,许多图表设置都有说明,共享给大家.. 其中有说明在SSRS中如果去写条件表达写和报表属性中的“自定义代码”,文章相对比较长,需要大家耐心的查 ...

随机推荐

  1. js获取Html元素的实际宽度高度

    第一种情况就是宽高都写在样式表里,就比如#div1{width:120px;}.这中情况通过#div1.style.width拿不到宽度,而通过#div1.offsetWidth才可以获取到宽度. 第 ...

  2. SingleTon单例模式总结篇

    在Java设计模式中,单例模式相对来说算是比较简单的一种构建模式.适用的场景在于:对于定义的一个类,在整个应用程序执行期间只有唯一的一个实例对象. 一,懒汉式: 其特点是延迟加载,即当需要用到此单一实 ...

  3. jquery的offset().top 和position().top 详解 和如何用js实现

    1 jquery定义: offset().top 相对于当前文档的坐标(的高度) ps:包括滚动条卷去的高度 position().top 返回的是相对于其定位的祖辈元素的坐标(的高度) ps:包括滚 ...

  4. js日期格式转换

    var mydate=new Date(); var year=mydate.getFullYear(); //获取四位数getYear() 获取两位 var month=mydate.getMont ...

  5. Dom4j把xml转换成Map(固定格式)

    /** * 可解析list * * @param fileName * @return * @throws Exception */ @SuppressWarnings("unchecked ...

  6. TCP/IP——基本知识

    TCP / IP通常被认为是一个四层协议系统: 1) 链路层,有时也称作数据链路层或网络接口层,通常包括操作系统中的设备驱动程序和计算机中对应的网络接口卡.它们一起处理与电缆(或其他任何传输媒介)的物 ...

  7. poj1399 hoj1037 Direct Visibility 题解 (宽搜)

    http://poj.org/problem?id=1399 http://acm.hit.edu.cn/hoj/problem/view?id=1037 题意: 在一个最多200*200的minec ...

  8. HTML兼容问题——HACK技术

    有话先说:本文的目的主要是向大家描述一下我们在遇见IE8版本一下以及Firefox兼容的问题. 针对不同的浏览器写不同的CSS的过程,这就叫CSS hack,也叫写CSS hack,相信您会对一些比较 ...

  9. idea之internal java compiler error

    启动错误:Error:java: Compilation failed: internal java compiler error 解决:将圈选地方改为对应的jdk版本即可

  10. 最大堆 最小堆 解决TOPK问题

    堆:实质是一颗完全二叉树,最大堆的特点:父节点值均大于子节点:最小堆的父节点值均小于子节点: 一般使用连续内存存储堆内的值,因而可以根据当前节点的索引值推断子节点的索引值: 节点i的父节点为(i-1) ...