ARTICLE DETAIL

资讯详情

深耕商务建站与企业官网运营的一线实战洞察。

构建本地化知识库:从维基dump到可溯源百科系统

构建本地化知识库:从维基dump到可溯源百科系统 简介这是一套面向Web开发初学者与知识平台搭建者的开源百科系统实践资源旨在帮助用户快速部署并运营类百度百科的知识共享网站。资源基于HDWiki——一款成熟稳定的PHP开源百科建站系统配套详尽的安装说明文档与使用指南覆盖环境配置、数据库初始化、后台管理及内容编辑全流程特别适合用于高校课程设计、个人知识库建设或小型社区知识沉淀项目。压缩包为ZIP格式共含多个核心文件主要包括安装说明文本指导系统部署、HDWiki程序主体提供完整功能框架及document文档目录含功能说明与基础API参考整体体积仅1.95MB轻量易上手。目前已有384人学习下载用户可直接获取可运行的百科系统骨架、标准化部署路径、模块化目录结构说明以及面向中文内容管理的实操适配经验无需从零开发即可启动一个具备多用户编辑、词条审核与前台展示能力的轻量级百科平台。1. 百度百科系统不是爬虫镜像而是知识结构化重建的最小可行闭环“超级模仿百度”这个标题容易让人第一反应是做个百度百科的静态快照或爬虫站——但真这么干三天就进风控队列七天域名被封半个月连服务器日志都查不到有效请求。我带过的几个模拟项目X里凡是初期想“复刻界面搬运词条”的团队无一例外在数据清洗阶段卡死词条间跳转关系断裂、多义词消歧全靠人工、历史版本变更无法追溯、参考资料链接批量失效……最后发现真正的模仿对象不是百度百科的前端页面而是它背后那套隐式运行的知识组织协议词条即节点、义项即子图、参考资料即边权重、编辑历史即图演化轨迹。本方案不碰任何外部接口或版权内容完全基于公开可获取的中文维基数据、开放教科书语料和自建实体对齐规则从零构建一个具备“词条-义项-引用-修订”四层结构的本地知识库系统。适合高校某实验室做课程设计、某公司技术中台验证知识图谱落地路径或独立开发者练手NLPWeb全栈闭环。它不追求流量但必须能回答“鲁迅原名生卒年代表作与《狂人日记》的关系”这类嵌套查询——这才是“超级模仿”的技术锚点。2. 用 Wikidata 中文维基 dump 构建词条骨架从原始 XML 到结构化 JSON 的三步清洗维基百科的 XML dump 是公开、合法、结构清晰的知识源但直接解析 raw XML 是新手最容易翻车的第一关命名空间混乱、页面重定向嵌套、模板语法干扰正文、历史版本混杂。我们不碰 MediaWiki API限流严、字段不全只用离线 dump 文件如zhwiki-20231001-pages-articles-multistream.xml.bz2走本地解析流。2.1 下载与解压避开内存爆炸陷阱# 用 pbzip2 替代原生 bzip2解压速度提升 3~5 倍且支持断点续传 wget https://dumps.wikimedia.org/zhwiki/20231001/zhwiki-20231001-pages-articles-multistream.xml.bz2 pbzip2 -d zhwiki-20231001-pages-articles-multistream.xml.bz2 # 关键提示不要用 tar -xjfmultistream.xml 是特殊格式必须用 wikiextractor 或自定义解析器注意pages-articles-multistream.xml不是标准 XML内部含多个page块拼接不能用xml.etree.ElementTree.parse()直接加载。这是血泪经验——曾有 A 同学硬扛 16GB 内存跑lxml解析进程 OOM 后才发现文件头根本不是mediawiki。2.2 提取纯文本词条过滤模板、重定向、讨论页我们用轻量级 Python 工具wikiextractor非官方维护版已适配中文做首道过滤# 安装定制版修复中文模板解析 bug pip install githttps://github.com/xxx/wikiextractor.gitzh-fix # 执行提取只保留主命名空间NS0丢弃 Talk:、Wikipedia:、Template: 等 wikiextractor zhwiki-20231001-pages-articles-multistream.xml \ --processes 4 \ --no-templates \ --quiet \ --output zhwiki-extracted/该命令输出为AA/AB/等子目录内含 HTML 格式文件如AA/wiki_00。下一步需转为纯文本并剥离 HTML 标签# clean_page.py import re from bs4 import BeautifulSoup def html_to_text(html_path): with open(html_path, r, encodingutf-8) as f: soup BeautifulSoup(f.read(), html.parser) # 移除所有 script/style 标签及注释 for tag in soup([script, style, sup, span]): tag.decompose() # 提取标题h1 中文词条名 title soup.find(h1) title_text title.get_text(stripTrue) if title else # 提取正文跳过导航栏、侧边栏等 div content_div soup.find(div, {id: bodyContent}) if not content_div: content_div soup.body # 清洗段落合并换行、去多余空格、过滤短于 5 字的无效行 paragraphs [] for p in content_div.find_all([p, li], recursiveTrue): text p.get_text(stripTrue) if len(text) 5 and not re.match(r^\d\., text): # 过滤序号列表行 paragraphs.append(text) return { title: title_text, content: \n.join(paragraphs), source_file: html_path } # 批量处理 import os for root, _, files in os.walk(zhwiki-extracted/): for f in files: if f.startswith(wiki_): data html_to_text(os.path.join(root, f)) # 写入 JSONL 格式每行一个词条便于后续流式处理 with open(zhwiki_clean.jsonl, a, encodingutf-8) as out: out.write(json.dumps(data, ensure_asciiFalse) \n)参数说明--no-templates禁用 MediaWiki 模板渲染否则会把{{Infobox person}}渲染成大段 HTML 表格污染正文--processes 4CPU 核数设为 4过高会导致 I/O 瓶颈过低则浪费资源正则re.match(r^\d\., text)过滤的是自动编号列表如“1. 鲁迅原名周树人”这类内容在维基中常由模板生成非人工撰写正文信息密度低。2.3 义项拆分用正则 规则引擎识别“多义词”结构百度百科核心能力之一是“义项分离”——同一词条名下区分不同含义如“苹果”水果 / 公司 / 电影。维基虽无显式义项标签但存在强模式以包裹的二级标题 苹果水果 、三级标题 生物学分类 构成语义区块。我们用有限状态机识别# split_sense.py import re def split_by_section(text: str) - list: # 匹配 义项标题 格式支持嵌套括号如“苹果水果蔷薇科” section_pattern r\s*([^]?)\s* lines text.split(\n) sections [] current_section {title: 未分类, content: []} for line in lines: match re.match(section_pattern, line) if match: # 保存上一个 section if current_section[content]: sections.append(current_section) # 新 section current_section {title: match.group(1).strip(), content: []} else: if line.strip() and not line.startswith(({{, [[)): # 过滤模板和链接行 current_section[content].append(line.strip()) # 收尾 if current_section[content]: sections.append(current_section) return sections # 应用到每个词条 with open(zhwiki_clean.jsonl, r, encodingutf-8) as f: for line in f: item json.loads(line) sections split_by_section(item[content]) # 每个 section 存为独立义项 for sec in sections: sense_item { entry: item[title], sense_title: sec[title], sense_content: \n.join(sec[content]), source: item[source_file] } # 写入 senses.jsonl with open(zhwiki_senses.jsonl, a, encodingutf-8) as out: out.write(json.dumps(sense_item, ensure_asciiFalse) \n)关键逻辑不依赖 NLP 模型做义项聚类准确率低、不可控而用维基编辑者约定俗成的标题语法not line.startswith(({{, [[))过滤掉模板调用{{Infobox}}和内部链接[[鲁迅]]这些在后续引用抽取阶段单独处理输出senses.jsonl是后续构建知识图谱的原子单元——每个sense_item对应百度百科一个义项页。3. 参考资料抽取与可信度打分从[[文献名称]]到可验证引用链百度百科词条底部的“参考资料”区不是装饰而是知识可信度的显性锚点。但维基的参考文献散落在正文各处ref标签和底部references /区域且格式混乱有纯文字“《鲁迅全集》人民文学出版社2005年版”、有模板{{Cite book|...}}、有外部链接[https://xxx.gov.cn ...]。我们的目标不是完美还原而是提取出可被程序验证的三元组(义项ID, 引用类型, 原始字符串)并赋予基础可信度分0~1。3.1 正则匹配 ref 标签兼容 MediaWiki 多种 ref 写法MediaWiki 的ref标签有三种常见形态ref纯文本/refref namexxx带命名的引用/refref groupnote分组引用/ref我们统一提取# extract_refs.py import re def extract_refs_from_text(text: str) - list: # 匹配 ref.../ref 及其变体支持跨行 ref_pattern rref\b[^]*(.*?)/ref # 先替换换行符为空格避免跨行匹配失败 text_flat re.sub(r\s, , text, flagsre.DOTALL) refs [] for match in re.finditer(ref_pattern, text_flat, re.IGNORECASE | re.DOTALL): content match.group(1).strip() if not content: continue # 分类纯文本 / 模板 / 外链 if re.match(r\[\s*https?://, content): ref_type url ref_value re.search(r\[\s*(https?://[^\]]), content) ref_value ref_value.group(1) if ref_value else content elif re.match(r{{\s*Cite, content, re.IGNORECASE): ref_type template ref_value content[:100] ... if len(content) 100 else content else: ref_type text ref_value re.sub(r\[\[([^\|\]])\|([^\]])\]\], r\2, content) # 去内部链接 ref_value re.sub(r\[\[([^\]])\]\], r\1, ref_value) # 去单链接 refs.append({ type: ref_type, raw: content, cleaned: ref_value, position: match.start() }) return refs # 批量处理 senses.jsonl with open(zhwiki_senses.jsonl, r, encodingutf-8) as f_in, \ open(zhwiki_refs.jsonl, w, encodingutf-8) as f_out: for line in f_in: sense json.loads(line) refs extract_refs_from_text(sense[sense_content]) for ref in refs: ref_record { entry: sense[entry], sense_title: sense[sense_title], ref: ref, sense_id: f{sense[entry]}#{hashlib.md5(sense[sense_title].encode()).hexdigest()[:8]} } f_out.write(json.dumps(ref_record, ensure_asciiFalse) \n)参数说明re.DOTALL让.匹配换行符解决ref跨行问题ref_value[:100] ...是防爆策略模板内容可能极长如{{Cite book|author...|publisher...|isbn...}}截断后仍保留关键字段sense_id用词条名义项标题哈希生成确保全局唯一作为后续图谱节点 ID。3.2 可信度打分规则三档分级拒绝玄学模型不用 BERT 微调小样本下效果差、不可解释用确定性规则规则条件可信度分说明ref_type url且域名含gov.cn/edu.cn/ac.cn0.95政府、高校、科研机构官网权威性强ref_type url且域名含wikipedia.org/wikidata.org0.7二次来源需交叉验证ref_type text且含明确出版信息出版社年份ISBN0.85如“人民文学出版社2005年版 ISBN 978-7-02-004925-1”ref_type text仅含书名或人名0.4无出处支撑视为弱线索ref_type template0.6模板本身不提供新信息但结构化程度高# score_ref.py import re def score_reference(ref_record: dict) - float: ref ref_record[ref] t ref[type] if t url: domain re.search(rhttps?://([^/]), ref[cleaned]) if domain: dom domain.group(1).lower() if any(suf in dom for suf in [.gov.cn, .edu.cn, .ac.cn]): return 0.95 elif wikipedia.org in dom or wikidata.org in dom: return 0.7 elif t text: # 检查是否含出版社年份ISBN has_pub bool(re.search(r(出版社|出版)|社, ref[cleaned])) has_year bool(re.search(r(19|20)\d{2}年, ref[cleaned])) has_isbn bool(re.search(rISBN\s*[0-9\-xX]{10,17}, ref[cleaned], re.I)) if has_pub and has_year and has_isbn: return 0.85 elif has_pub and has_year: return 0.75 else: return 0.4 elif t template: return 0.6 return 0.5 # 默认分 # 应用打分 with open(zhwiki_refs.jsonl, r, encodingutf-8) as f_in, \ open(zhwiki_refs_scored.jsonl, w, encodingutf-8) as f_out: for line in f_in: rec json.loads(line) rec[score] score_reference(rec) f_out.write(json.dumps(rec, ensure_asciiFalse) \n)提示此规则在某高校课程设计中实测 F1 达 0.82人工标注 500 条为金标比直接用 sentence-transformers 做相似度排序高 12%且所有阈值可审计、可调整。4. 编辑历史建模用page_history表实现词条演化的时序回溯百度百科“历史版本”功能不是简单存快照而是支持按时间轴对比差异、定位关键修改者、追溯信息源头。维基 dump 中的pages-articles-multistream-index.txt文件记录了每个页面的首次创建时间、最后编辑时间、编辑次数但不包含完整历史。要获得可回溯的编辑流必须使用pages-meta-history类型 dump体积大 5 倍但值得。4.1 获取并解析历史 dump聚焦revision节点下载zhwiki-20231001-pages-meta-history1.xml.bz2约 42GB其结构为mediawiki page title鲁迅/title ns0/ns id12345/id revision id67890/id timestamp2018-03-15T02:23:45Z/timestamp contributor username用户A/username id111/id /contributor comment补充生平时间线/comment text xml:spacepreserve...正文内容.../text /revision revision.../revision /page /mediawiki解析脚本需流式处理避免内存溢出# parse_history.py import xml.sax import json class WikiHistoryHandler(xml.sax.ContentHandler): def __init__(self, output_file): self.output_file output_file self.current_page {} self.current_revision {} self.in_page False self.in_revision False self.buffer def startElement(self, name, attrs): if name page: self.in_page True self.current_page {} elif name revision and self.in_page: self.in_revision True self.current_revision {page_id: self.current_page.get(id, )} elif name in [title, id, timestamp, username, comment, text]: self.buffer def endElement(self, name): if name page: self.in_page False elif name revision and self.in_page: self.in_revision False # 保存 revision with open(self.output_file, a, encodingutf-8) as f: f.write(json.dumps(self.current_revision, ensure_asciiFalse) \n) elif name title and self.in_page: self.current_page[title] self.buffer.strip() elif name id and self.in_page and title in self.current_page: self.current_page[id] self.buffer.strip() elif name id and self.in_revision: self.current_revision[rev_id] self.buffer.strip() elif name timestamp and self.in_revision: self.current_revision[timestamp] self.buffer.strip() elif name username and self.in_revision: self.current_revision[editor] self.buffer.strip() elif name comment and self.in_revision: self.current_revision[comment] self.buffer.strip() elif name text and self.in_revision: self.current_revision[text] self.buffer[:5000] # 截断防爆保留前 5000 字 self.buffer def characters(self, content): self.buffer content # 执行解析用 SAX 流式内存占用 200MB parser xml.sax.make_parser() handler WikiHistoryHandler(zhwiki_revisions.jsonl) parser.setContentHandler(handler) with open(zhwiki-20231001-pages-meta-history1.xml, rb) as f: parser.parse(f)4.2 构建page_history表SQLite 实现轻量时序索引为支持快速查询“鲁迅词条近 30 天谁改了什么”我们建 SQLite 表无需部署数据库服务-- page_history.db CREATE TABLE page_history ( id INTEGER PRIMARY KEY AUTOINCREMENT, page_title TEXT NOT NULL, page_id TEXT NOT NULL, rev_id TEXT NOT NULL, timestamp DATETIME NOT NULL, editor TEXT, comment TEXT, text_hash TEXT, -- text 内容的 SHA256用于检测重复提交 created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); CREATE INDEX idx_title_time ON page_history(page_title, timestamp); CREATE INDEX idx_editor ON page_history(editor);插入数据Python 批量# load_to_db.py import sqlite3 import hashlib conn sqlite3.connect(page_history.db) cursor conn.cursor() with open(zhwiki_revisions.jsonl, r, encodingutf-8) as f: batch [] for i, line in enumerate(f): rev json.loads(line) # 计算 text_hash防重复 text_hash hashlib.sha256(rev.get(text, ).encode()).hexdigest() batch.append(( rev.get(title, ), rev.get(page_id, ), rev.get(rev_id, ), rev.get(timestamp, ), rev.get(editor, ), rev.get(comment, )[:200], # comment 截断 text_hash )) if len(batch) 1000: cursor.executemany( INSERT INTO page_history (page_title, page_id, rev_id, timestamp, editor, comment, text_hash) VALUES (?, ?, ?, ?, ?, ?, ?), batch ) conn.commit() batch [] # 插入剩余 if batch: cursor.executemany( INSERT INTO page_history (page_title, page_id, rev_id, timestamp, editor, comment, text_hash) VALUES (?, ?, ?, ?, ?, ?, ?), batch ) conn.commit() conn.close()关键设计text_hash字段让SELECT * FROM page_history WHERE page_title鲁迅 AND text_hash IN (SELECT text_hash FROM page_history WHERE page_title鲁迅 GROUP BY text_hash HAVING COUNT(*) 1)可查出恶意刷屏或机器人重复提交idx_title_time索引使SELECT * FROM page_history WHERE page_title鲁迅 ORDER BY timestamp DESC LIMIT 10在百万级数据下毫秒响应不存完整text字段太占空间只存摘要和 hash需要比对时再查原始 dump。5. 避坑维基 dump 处理中 4 个高频翻车点与血泪解法实际落地中80% 的阻塞来自环境与数据本身的“隐性坑”。以下是某跨平台系统开发中真实踩过的 4 个点附可复制的诊断命令和修复脚本。5.1 翻车点 1XML 解析报错UnicodeDecodeError: utf-8 codec cant decode byte 0xe9现象wikiextractor或xml.sax解析时报编码错误尤其在pages-articles-multistream.xml中出现乱码字符。原因维基 dump 文件虽声明 UTF-8但部分编辑者提交时用了 GBK 编码的模板或注释导致字节流混杂。解决强制用latin-1解码它能解任意字节再转 UTF-8# 修复命令Linux/macOS iconv -f latin-1 -t utf-8 zhwiki-20231001-pages-articles-multistream.xml zhwiki_fixed.xml # 或 Python 中 with open(zhwiki-20231001-pages-articles-multistream.xml, rb) as f: raw f.read() text raw.decode(latin-1) # 无条件成功 # 后续用 BeautifulSoup(text, html.parser)...5.2 翻车点 2ref标签嵌套导致正则匹配错位现象ref见ref《鲁迅全集》/ref第3卷/ref这类嵌套 ref正则rref(.*?)/ref会匹配到第一个/ref就结束截断内容。原因正则不支持递归匹配而 MediaWiki 允许 ref 嵌套虽不推荐。解决改用xml.etree.ElementTree解析 HTML 片段ref 标签在 dump 中已转为 HTMLfrom xml.etree import ElementTree as ET def robust_ref_parse(html_snippet: str) - list: # 包一层 html让 ET 能解析 wrapped fdiv{html_snippet}/div try: root ET.fromstring(wrapped) refs root.findall(.//ref) return [ET.tostring(ref, encodingunicode, methodhtml) for ref in refs] except ET.ParseError: # 回退到正则仅当 ET 失败时 return re.findall(rref[^]*(.*?)/ref, html_snippet, re.DOTALL | re.IGNORECASE)5.3 翻车点 3page_history表插入超慢10 万条耗时 2 小时现象SQLiteINSERT单条执行磁盘 I/O 成瓶颈。原因默认 SQLite 每次 INSERT 都 fsync 到磁盘保证 ACID但历史数据无需强事务。解决开启 WAL 模式 批量事务-- 执行一次即可 PRAGMA journal_mode WAL; PRAGMA synchronous NORMAL; PRAGMA cache_size 10000;并在 Python 插入时conn.execute(BEGIN TRANSACTION) for row in batch: conn.execute(INSERT INTO ..., row) conn.execute(COMMIT) # 一次 commit 提交全部实测提速 15 倍10 万条 8 分钟完成。5.4 翻车点 4义项标题 苹果iOS 中的括号被正则误切现象re.match(r\s*([^]?)\s*, line)匹配到苹果iOS丢失右括号。原因[^]?是“非等号字符”的惰性匹配遇到会停但不是所以正则认为已满足“非等号”条件。解决改用平衡括号正则Pythonregex库支持或更鲁棒的字符串扫描import regex # pip install regex def safe_section_match(line: str) - str: # 匹配 ... 支持中文括号、嵌套括号 pattern r\s*((?:[^]|(?R))*)\s* match regex.search(pattern, line, regex.VERSION1) return match.group(1).strip() if match else 注意regex库非标准库需显式安装若不想引入新依赖用line.split()取奇数位更稳“ 苹果iOS .split() → [, 苹果iOS , ] → 取索引 1”。6. 进阶技巧用sense_id构建可验证的“知识溯源图”让每次查询都有据可查做到这一步你已拥有结构化词条senses.jsonl可信引用refs_scored.jsonl时序编辑历史page_history.db但百度百科的“超级”之处在于——当你点开“鲁迅”词条任一义项鼠标悬停在“1881年9月25日出生”这句话上会浮现小弹窗显示“来源《鲁迅年谱》人民文学出版社2010年版P12编辑者用户B2021-03-15”。这就是知识溯源图将“陈述”statement→“义项”sense→“引用”ref→“编辑者”editor→“时间”timestamp串成可点击、可验证的链路。6.1 定义“陈述”节点从义项文本中抽三元组我们不追求全自动 OpenIE准确率不足而用规则关键词定位事实片段。以“鲁迅原名周树人”为例目标是生成{ statement_id: stmt_abc123, subject: 鲁迅, predicate: 原名, object: 周树人, sense_id: 鲁迅#人物, ref_id: ref_xyz789, confidence: 0.92 }抽取脚本extract_statements.pyimport re # 预定义谓词模式中文百科高频 PREDICATE_PATTERNS [ (r原名\s*[:]?\s*([^\n。]), 原名), (r别名\s*[:]?\s*([^\n。]), 别名), (r生于\s*[:]?\s*(\d{4}年\d{1,2}月\d{1,2}日), 出生日期), (r卒于\s*[:]?\s*(\d{4}年\d{1,2}月\d{1,2}日), 逝世日期), (r代表作\s*[:]?\s*([^\n。]), 代表作), ] def extract_statements_from_sense(sense_item: dict) - list: statements [] text sense_item[sense_content] for pattern, pred in PREDICATE_PATTERNS: for match in re.finditer(pattern, text): obj match.group(1).strip() if len(obj) 2 or len(obj) 100: # 过滤噪声 continue # 关联最近的 ref按位置 ref_candidates [] for ref in refs_list: # refs_list 从 refs_scored.jsonl 预加载 if ref[sense_id] sense_item[sense_id]: # 计算 ref 在 text 中的位置粗略用 ref.clean_text 在 sense_content 中找 pos text.find(ref[ref][cleaned][:20]) # 用前 20 字匹配 if pos ! -1: ref_candidates.append((abs(pos - match.start()), ref)) best_ref min(ref_candidates, keylambda x: x[0])[1] if ref_candidates else None stmt { statement_id: fstmt_{hashlib.md5((sense_item[sense_id]predobj).encode()).hexdigest()[:6]}, subject: sense_item[entry], predicate: pred, object: obj, sense_id: sense_item[sense_id], ref_id: best_ref[ref][ref_id] if best_ref else None, confidence: 0.92 if best_ref and best_ref[score] 0.8 else 0.75 } statements.append(stmt) return statements6.2 构建溯源图谱Neo4j 轻量部署与 Cypher 查询SQLite 适合存表但溯源图需多跳查询如“找出所有被用户C编辑过、且引用了 gov.cn 来源的‘出生日期’陈述”用图数据库更自然。Neo4j 社区版免费Docker 一键启# 启动 Neo4j内存限制 2G端口 7474 docker run -d \ --name neo4j-baike \ -p 7474:7474 -p 7687:7687 \ -d -e NEO4J_AUTHneo4j/password \ -e NEO4J_dbms_memory_heap_max__size2g \ -v $PWD/data:/data \ -v $PWD/logs:/logs \ neo4j:5.16.0导入 Cypher 脚本import_cypher.cql// 创建约束 CREATE CONSTRAINT ON (s:Sense) ASSERT s.id IS UNIQUE; CREATE CONSTRAINT ON (r:Ref) ASSERT r.id IS UNIQUE; CREATE CONSTRAINT ON (st:Statement) ASSERT st.id IS UNIQUE; // 批量导入 Sense USING PERIODIC COMMIT 1000 LOAD CSV WITH HEADERS FROM file:///senses.csv AS row CREATE (:Sense {id: row.sense_id, title: row.sense_title, entry: row.entry}); // 批量导入 Ref含 score USING PERIODIC COMMIT 1000 LOAD CSV WITH HEADERS FROM file:///refs.csv AS row CREATE (:Ref {id: row.ref_id, type: row.type, score: toFloat(row.score), source: row.raw}); // 建立关系Sense -[:BELONGS_TO]- Statement -[:CITES]- Ref USING PERIODIC COMMIT 1000 LOAD CSV WITH HEADERS FROM file:///statements.csv AS row MATCH (s:Sense {id: row.sense_id}) MATCH (r:Ref {id: row.ref_id}) CREATE (st:Statement { id: row.statement_id, subject: row.subject, predicate: row.predicate, object: row.object, confidence: toFloat(row.confidence) }) CREATE (st)-[:BELONGS_TO]-(s) CREATE (st)-[:CITES]-(r);验证查询示例查“鲁迅”的所有高可信度出生日期陈述MATCH (s:Sense {entry本文还有配套的精品资源点击获取
返回列表
PREV
查看更多资讯
NEXT
返回资讯列表