将英文维基百科转储导入 SQL 服务器
Import English Wikipedia dump into SQL Server
我已经从 here 下载了最新的英文维基百科转储 (enwiki-latest-pages-articles-multistream.xml),我正在尝试将其导入 SQL服务器 2018.
我看不到 XML 文件,因为它超过 75 GB,因此我不知道在使用 Bulk XML.
我该怎么做?我可以在 Python 或 C# 上编写一些脚本。提前致谢!
使用以下
SQL 查询创建数据库
Create Database Feed
;
GO
USE [Feed]
drop table Doc
drop table Links
;
GO
CREATE TABLE [dbo].[Doc](
DocID int primary key,
Title [varchar](50) NULL,
URL [varchar](50) NULL,
Abstract [varchar](50) NULL
)
CREATE TABLE Links(
DocID int,
LinkType [varchar](10) NULL,
Anchor [varchar](50) NULL,
Link [varchar](50) NULL
CONSTRAINT FK_DocID FOREIGN KEY (DocID)
REFERENCES dbo.Doc (DocID)
)
c# 代码从 xml
填充数据库
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Data;
using System.Data.SqlClient;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
const string CONNECTION_STRING = @"Server=.\SQLEXPRESS;Database=Feed;Trusted_Connection=True;";
const string INSERT_DOC =
"INSERT INTO [Feed].[dbo].[Doc] (" +
"DocID, Title , URL, Abstract)" +
" VALUES " +
"(@DocID, @Title, @URL, @Abstract)";
const string INSERT_LINK =
"INSERT INTO [Feed].[dbo].[Links] (" +
"DocID, LinkType , Anchor, Link)" +
" VALUES " +
"(@DocID, @Linktype, @Anchor, @Link)";
static void Main(string[] args)
{
SqlConnection conn = new SqlConnection(CONNECTION_STRING);
conn.Open();
SqlCommand docCmd = new SqlCommand(INSERT_DOC, conn);
docCmd.Parameters.Add("@DocID", SqlDbType.Int);
docCmd.Parameters.Add("@Title", SqlDbType.VarChar, 50);
docCmd.Parameters.Add("@URL", SqlDbType.VarChar, 50);
docCmd.Parameters.Add("@Abstract", SqlDbType.VarChar, 50);
SqlCommand linksCmd = new SqlCommand(INSERT_LINK, conn);
linksCmd.Parameters.Add("@DocID", SqlDbType.Int);
linksCmd.Parameters.Add("@LinkType", SqlDbType.VarChar, 10);
linksCmd.Parameters.Add("@Anchor", SqlDbType.VarChar, 50);
linksCmd.Parameters.Add("@Link", SqlDbType.VarChar, 50);
XmlReader reader = XmlReader.Create(FILENAME);
int id = 0;
while (!reader.EOF)
{
if (reader.Name != "doc")
{
reader.ReadToFollowing("doc");
}
if (!reader.EOF)
{
XElement doc = (XElement)XElement.ReadFrom(reader);
id++;
docCmd.Parameters["@DocID"].Value = id;
docCmd.Parameters["@Title"].Value = (string)doc.Element("title");
docCmd.Parameters["@URL"].Value = (string)doc.Element("url");
docCmd.Parameters["@Abstract"].Value = (string)doc.Element("abstract");
int docRowsChanged = docCmd.ExecuteNonQuery();
foreach (XElement sublink in doc.Descendants("sublink"))
{
linksCmd.Parameters["@DocID"].Value = id;
linksCmd.Parameters["@LinkType"].Value = (string)sublink.Attribute("linktype");
linksCmd.Parameters["@Anchor"].Value = (string)sublink.Element("anchor");
linksCmd.Parameters["@Link"].Value = (string)sublink.Element("link");
int linksRowsChanged = linksCmd.ExecuteNonQuery();
}
}
}
}
}
}
处理这个问题的最佳方法是创建一个 MediaWiki 实例并将 XML 转储导入该实例,这将使 MediaWiki 创建一个 SQL 数据库,然后您可以将其用于其他用途。
您可以通过从 https://mediawiki.org/wiki/Download. If you really need to use Microsoft SQL server, I recommend to download MediaWiki 1.31.8 (latest LTS), because MSSQL server support was dropped in 1.34 (see more at https://www.mediawiki.org/wiki/Manual:Microsoft_SQL_Server) 下载 MediaWiki 来完成此操作。
一旦您的 MediaWiki 服务器启动并 运行ning,您需要 运行 导入脚本。最好的办法是将XML文件复制到wiki所在的服务器运行ning,从MediaWiki根目录运行php maintenance/importDump.php /path/to/dumpfile
(如果你的MediaWiki是运行ning 在 /var/www/html/mw
中,然后 cd 到该目录,然后 运行 脚本),参见 https://www.mediawiki.org/wiki/Manual:Importing_XML_dumps。
希望对您有所帮助!
我已经从 here 下载了最新的英文维基百科转储 (enwiki-latest-pages-articles-multistream.xml),我正在尝试将其导入 SQL服务器 2018.
我看不到 XML 文件,因为它超过 75 GB,因此我不知道在使用 Bulk XML.
我该怎么做?我可以在 Python 或 C# 上编写一些脚本。提前致谢!
使用以下
SQL 查询创建数据库
Create Database Feed
;
GO
USE [Feed]
drop table Doc
drop table Links
;
GO
CREATE TABLE [dbo].[Doc](
DocID int primary key,
Title [varchar](50) NULL,
URL [varchar](50) NULL,
Abstract [varchar](50) NULL
)
CREATE TABLE Links(
DocID int,
LinkType [varchar](10) NULL,
Anchor [varchar](50) NULL,
Link [varchar](50) NULL
CONSTRAINT FK_DocID FOREIGN KEY (DocID)
REFERENCES dbo.Doc (DocID)
)
c# 代码从 xml
填充数据库using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;
using System.Data;
using System.Data.SqlClient;
namespace ConsoleApplication1
{
class Program
{
const string FILENAME = @"c:\temp\test.xml";
const string CONNECTION_STRING = @"Server=.\SQLEXPRESS;Database=Feed;Trusted_Connection=True;";
const string INSERT_DOC =
"INSERT INTO [Feed].[dbo].[Doc] (" +
"DocID, Title , URL, Abstract)" +
" VALUES " +
"(@DocID, @Title, @URL, @Abstract)";
const string INSERT_LINK =
"INSERT INTO [Feed].[dbo].[Links] (" +
"DocID, LinkType , Anchor, Link)" +
" VALUES " +
"(@DocID, @Linktype, @Anchor, @Link)";
static void Main(string[] args)
{
SqlConnection conn = new SqlConnection(CONNECTION_STRING);
conn.Open();
SqlCommand docCmd = new SqlCommand(INSERT_DOC, conn);
docCmd.Parameters.Add("@DocID", SqlDbType.Int);
docCmd.Parameters.Add("@Title", SqlDbType.VarChar, 50);
docCmd.Parameters.Add("@URL", SqlDbType.VarChar, 50);
docCmd.Parameters.Add("@Abstract", SqlDbType.VarChar, 50);
SqlCommand linksCmd = new SqlCommand(INSERT_LINK, conn);
linksCmd.Parameters.Add("@DocID", SqlDbType.Int);
linksCmd.Parameters.Add("@LinkType", SqlDbType.VarChar, 10);
linksCmd.Parameters.Add("@Anchor", SqlDbType.VarChar, 50);
linksCmd.Parameters.Add("@Link", SqlDbType.VarChar, 50);
XmlReader reader = XmlReader.Create(FILENAME);
int id = 0;
while (!reader.EOF)
{
if (reader.Name != "doc")
{
reader.ReadToFollowing("doc");
}
if (!reader.EOF)
{
XElement doc = (XElement)XElement.ReadFrom(reader);
id++;
docCmd.Parameters["@DocID"].Value = id;
docCmd.Parameters["@Title"].Value = (string)doc.Element("title");
docCmd.Parameters["@URL"].Value = (string)doc.Element("url");
docCmd.Parameters["@Abstract"].Value = (string)doc.Element("abstract");
int docRowsChanged = docCmd.ExecuteNonQuery();
foreach (XElement sublink in doc.Descendants("sublink"))
{
linksCmd.Parameters["@DocID"].Value = id;
linksCmd.Parameters["@LinkType"].Value = (string)sublink.Attribute("linktype");
linksCmd.Parameters["@Anchor"].Value = (string)sublink.Element("anchor");
linksCmd.Parameters["@Link"].Value = (string)sublink.Element("link");
int linksRowsChanged = linksCmd.ExecuteNonQuery();
}
}
}
}
}
}
处理这个问题的最佳方法是创建一个 MediaWiki 实例并将 XML 转储导入该实例,这将使 MediaWiki 创建一个 SQL 数据库,然后您可以将其用于其他用途。
您可以通过从 https://mediawiki.org/wiki/Download. If you really need to use Microsoft SQL server, I recommend to download MediaWiki 1.31.8 (latest LTS), because MSSQL server support was dropped in 1.34 (see more at https://www.mediawiki.org/wiki/Manual:Microsoft_SQL_Server) 下载 MediaWiki 来完成此操作。
一旦您的 MediaWiki 服务器启动并 运行ning,您需要 运行 导入脚本。最好的办法是将XML文件复制到wiki所在的服务器运行ning,从MediaWiki根目录运行php maintenance/importDump.php /path/to/dumpfile
(如果你的MediaWiki是运行ning 在 /var/www/html/mw
中,然后 cd 到该目录,然后 运行 脚本),参见 https://www.mediawiki.org/wiki/Manual:Importing_XML_dumps。
希望对您有所帮助!