Neo4j

文章目录

  • Neo4j
    • 简介
    • 启动
    • 导入数据
      • 准备数据集
      • 创建节点
      • 创建关系
    • 索引
      • 创建索引
      • 删除索引
    • CQL(Cypher Query Language)
    • 客户端驱动
    • 参考

简介

  • 定义:一种基于图论实现 NoSQL 的数据库管理系统,用节点和关系、属性表现实体内容

  • 特点:

    • 根据其连接的关系可以快速找出其邻近节点

    • 支持 ACID

    • 社区版只能单机使用,企业版才能使用分布式安装(负载均衡与高可用)

  • 应用领域

    • 社交网络、推荐引擎、交通物流、欺诈风控
  • 不适用场景:

    • 记录大量基于事件的数据

    • 需要对大规模分布式数据进行处理

    • 二进制数据存储

    • 适合保存在关系型数据库的结构化数据

  • 下载:https://neo4j.com/download-center/#community

启动

# 前置依赖 JRE(Java Runtime Environment)$ cd <NEO4J_HOME>$ vim ./conf/neo4j.conf
# The name of the default database
dbms.default_database=sanguo# Bolt connector
dbms.connector.bolt.enabled=true
dbms.connector.bolt.tls_level=DISABLED
dbms.connector.bolt.listen_address=:7687# HTTP Connector. There can be zero or one HTTP connectors.
dbms.connector.http.enabled=true
dbms.connector.http.listen_address=:7474$ ./bin/neo4j console
2021-02-27 02:45:15.154+0000 INFO  Starting...
2021-02-27 02:45:21.637+0000 INFO  ======== Neo4j 4.2.3 ========
2021-02-27 02:45:26.105+0000 INFO  Performing postInitialization step for component 'security-users' with version 2 and status CURRENT
2021-02-27 02:45:26.106+0000 INFO  Updating the initial password in component 'security-users'
2021-02-27 02:45:34.404+0000 INFO  Bolt enabled on localhost:7687.
2021-02-27 02:45:35.254+0000 INFO  Remote interface available at http://localhost:7474/
2021-02-27 02:45:35.255+0000 INFO  Started

终端 Shell 访问

$ ./bin/cypher-shell -a 127.0.0.1 -u neo4j -p 123456
Connected to Neo4j using Bolt protocol version 4.2 at neo4j://127.0.0.1:7687 as user neo4j.
Type :help for a list of available commands or :exit to exit the shell.
Note that Cypher queries must end with a semicolon.neo4j@sanguo> MATCH (n) RETURN n;
+------------------------+
| n                      |
+------------------------+
| (:Country {name: "魏"}) |
| (:Country {name: "吴"}) |
| (:Country {name: "蜀"}) |
+------------------------+

浏览器访问:

输入数据库名(sanguo),默认用户名及密码(neo4j)

导入数据

准备数据集
# 查看数据导入的目录
$ less ./conf/neo4j.conf
# This setting constrains all `LOAD CSV` import files to be under the `import` directory. Remove or comment it out to
# allow files to be loaded from anywhere in the filesystem; this introduces possible security problems. See the
# `LOAD CSV` section of the manual for details.
dbms.directories.import=import# 将数据集(csv)下载至 import 目录
$ wget -O ./import/sanguo.csv 'https://raw.githubusercontent.com/wangfangye/kg-hongloumeng/master/data/data/三国演义/triples.csv'
--2021-02-26 19:21:46--  https://raw.githubusercontent.com/wangfangye/kg-hongloumeng/master/data/data/%E4%B8%89%E5%9B%BD%E6%BC%94%E4%B9%89/triples.csv
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.109.133, 185.199.110.133, 185.199.111.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.109.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 5926 (5.8K) [text/plain]
Saving to: ‘import/sanguo.csv’import/sanguo.csv                          100%[======================================================================================>]   5.79K  --.-KB/s    in 0s      2021-02-26 19:21:47 (26.6 MB/s) - ‘import/sanguo.csv’ saved [5926/5926]$ ls ./import/
sanguo.csv$ head ./import/sanguo.csv
"head","tail","relation","label"
"关羽","刘备","younger_sworn_brother","义弟"
"张飞","刘备","younger_sworn_brother","义弟"
"关羽","张飞","elder_sworn_brother","义兄"
"张苞","张飞","son","儿子"
"关兴","关羽","son","儿子"
"关平","张苞","sworn","结拜"
"关平","关羽","adopted_son","义子"
"卢植","刘备","master","师傅"
"公孙瓒","刘备","friend","朋友"
创建节点

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MERGE (:Hero { name: line.tail});

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MERGE (:Hero { name: line.head});

MATCH (n) RETURN n;

创建关系
$ awk -F ',' '{ print $4 }'  ./import/sanguo.csv | sort | uniq
"label"
"主公"
"义兄"
"义女"
"义子"
"义弟"
"义父"
"儿子"
"叔叔"
"同事"
"同族"
"哥哥"
"堂弟"
"夫"
"女儿"
"女婿"
"妹妹"
"妻"
"妻子"
"妾"
"嫂子"
"岳母"
"师傅"
"弟弟"
"徒弟"
"朋友"
"母亲"
"父亲"
"结拜"
"臣"
"让位"
"诸侯"

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘义女’ MERGE (h1)-[:义女]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘义子’ MERGE (h1)-[:义子]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘义父’ MERGE (h1)-[:义父]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘徒弟’ MERGE (h1)-[:徒弟]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘同事’ MERGE (h1)-[:同事]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘妾’ MERGE (h1)-[:妾]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘女儿’ MERGE (h1)-[:女儿]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘让位’ MERGE (h1)-[:让位]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘哥哥’ MERGE (h1)-[:哥哥]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘义兄’ MERGE (h1)-[:义兄]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘父亲’ MERGE (h1)-[:父亲]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘朋友’ MERGE (h1)-[:朋友]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘夫’ MERGE (h1)-[:夫]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘主公’ MERGE (h1)-[:主公]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘师傅’ MERGE (h1)-[:师傅]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘臣’ MERGE (h1)-[:臣]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘母亲’ MERGE (h1)-[:母亲]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘岳母’ MERGE (h1)-[:岳母]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘诸侯’ MERGE (h1)-[:诸侯]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘同族’ MERGE (h1)-[:同族]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘嫂子’ MERGE (h1)-[:嫂子]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘儿子’ MERGE (h1)-[:儿子]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘女婿’ MERGE (h1)-[:女婿]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘堂弟’ MERGE (h1)-[:堂弟]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘结拜’ MERGE (h1)-[:结拜]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘叔叔’ MERGE (h1)-[:叔叔]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘妻子’ MERGE (h1)-[:妻子]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘弟弟’ MERGE (h1)-[:弟弟]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘妹妹’ MERGE (h1)-[:妹妹]->(h2);

LOAD CSV WITH HEADERS FROM ‘file:///sanguo.csv’ AS line FIELDTERMINATOR ‘,’
MATCH (h1:Hero),(h2:Hero) WHERE h1.name = line.head AND h2.name = line.tail AND line.label = ‘义弟’ MERGE (h1)-[:义弟]->(h2);

MATCH (n) RETURN n

索引

RETURN (:Hero{name:“曹操”})-[*…1]->(:Hero)

PROFILE RETURN (:Hero{name:“曹操”})-[…1]->(:Hero)
EXPLAIN RETURN (:Hero{name:“曹操”})-[
…1]->(:Hero)

创建索引

唯一索引:CREATE CONSTRAINT ON (h:Hero) ASSERT h.name IS UNIQUE
普通索引:CREATE INDEX FOR (n:Hero) ON (n.name)

:schema

RETURN (:Hero{name:“曹操”})-[*…1]->(:Hero)

删除索引

删除唯一索引:DROP CONSTRAINT ON (h:Hero) ASSERT h.name IS UNIQUE
删除普通索引:DRO INDEX index_53dd4bad

CQL(Cypher Query Language)

  • 语句结构

    [MATCH WHERE]
    [OPTIONAL MATCH WHERE]
    [WITH [ORDER BY] [SKIP] [LIMIT]]
    (CREATE [UNIQUE] | MERGE)*
    [SET | DELETE | REMOVE | FOREACH]*
    [RETURN [ORDER BY] [SKIP] [LIMIT]]
    
  • 运算符

    • +, -, *, /, %, ^
    • =, <>, <, >, <=, >=
    • AND, OR, XOR, NOT
    • 字符串运算符:+
    • 列表运算符:+, IN, [x], [x .. y]
    • 正则表达式运算符:=~
    • 字符串匹配运算符:STARTS WITH, ENDS WITH, CONTAINS
# (变量别名:节点)-[关系别名:关系]->(变量别名2:节点2)-[:关系2]->()-[*..N]->(:节点3)# 查找
match p=shortestPath((m:Hero{name:"曹操"})-[*]-(n:Hero{name:"袁绍"})) return p;MATCH (n:Hero) WHERE id(n)= 121 RETURN n;
MATCH (n:Hero) WHERE n.name="刘备" RETURN n;
MATCH (n:Hero{name:"刘备"}) RETURN n;
MATCH (n:Hero) WHERE n.name IN ["曹操", "刘备", "孙权"] RETURN n AS result;
MATCH (n:Hero) WHERE n.name STARTS WITH "曹" RETURN n;
MATCH (n:Hero) WHERE n.name <> "刘备" AND n.name STARTS WITH "刘" RETURN n;
MATCH (n:Hero) WHERE n.name STARTS WITH "刘" RETURN n.name UNION MATCH (n:Hero) WHERE n.name STARTS WITH "曹" RETURN n.name;
MATCH (m:Hero{name:"曹操"})-[:大王]->(n) WHERE n.name STARTS WITH "夏侯" WITH m, COUNT(n) AS count_n RETURN count_n# 更新
match (n:Hero{name:"超昂"}) set n.name = "曹昂"# 创建
WITH ["魏", "吴", "蜀"] as col FOREACH (v IN col | CREATE (:Country{name:v}))match (n:Hero{name:"甄氏"}) return n;
create (:Hero{name:"甄氏"});
match (m:Hero{name:"袁熙"}),(n:Hero{name:"曹丕"}) create (o:Hero{name:"甄氏"}), (o)-[:妻子]->(m),(o)-[:妾]->(n);match (m:Hero{name:"黄月英"}), (n:Hero{name:"诸葛亮"}) create (m)-[:妻子]->(n);
match (m:Hero{name:"张飞"}), (n:Hero{name:"刘禅"}) create (m)-[:岳父]->(n);match p=((n:Hero{name:"孙权"})-[*..4]-(m:Hero)) return p;
match (m:Hero{name:"孙坚"}),(n:Hero{name:"袁术"}) create (m)-[:臣]->(n);
match (m:Hero{name:"曹嵩"}) create (:Hero{name:"曹腾"})-[:义父]->(m);
match (:Hero{name:"曹腾"})-[r:义父]-(:Hero{name:"曹嵩"}) delete r;
match (m:Hero{name:"曹腾"}) delete m;# 删除
match (m:Hero{name:"甄氏"}) detach delete mmatch (m:Hero)-[r:主公]->(n:Hero) create (m)-[:大王]->(n)
match (m:Hero)-[r:主公]->(n:Hero) delete r

客户端驱动


https://neo4j.com/download-center/#community

以 Node.js 为例

npm install neo4j-driver
const neo4j = require("neo4j-driver")var driver = neo4j.driver("bolt://localhost:7687", neo4j.auth.basic("neo4j", "123456"))var session = driver.session();session.run("MATCH (h:Hero) WHERE h.name STARTS WITH '曹' RETURN h")
.then(function(result) {var records = result.recordsrecords.forEach((val, idx) => {console.log(val._fields[0].properties)})
}, function (err) {console.log(err)
})
$ node index.js
{ name: '曹操' }
{ name: '曹嵩' }
{ name: '曹真' }
{ name: '曹仁' }
{ name: '曹丕' }
{ name: '曹爽' }
{ name: '曹纯' }
{ name: '曹植' }

参考

  • Cypher 语法:https://neo4j.com/docs/cypher-manual/4.2/
  • 示例数据集:https://github.com/wangfangye/kg-hongloumeng/tree/master/data/data
  • 《Neo4j 全栈开发》:https://www.jb51.net/books/701559.html
  • https://gitbook.cn/books/5a33782c5778440a9d906017/index.html
  • https://blog.csdn.net/RHJlife/article/details/108586578
  • http://www.openkg.cn/group

Neo4j 示例:三国志人物关系图谱相关推荐

  1. Python + Neo4j(安装)可视化分析漫威十年人物关系图谱

    目录 1 数据爬取 1.1 漫威人物关系图谱网站 1.2 爬取人物关系数据 2 Neo4j的安装及服务启动 2.1 Neo4j下载安装 2.2 开启Neo4j服务 3 数据准备 3.1 加入列名 3. ...

  2. 在图数据库Neo4j中创建红楼梦人物关系图谱

    在图数据库Neo4j中创建红楼梦人物关系图谱 1.加载csv数据文件 load csv from 'file:///triples.csv' as linecreate (:role {name:li ...

  3. PersonGraphDataSet近十万的开放人物关系图谱项目

    PersonGraphDataSet PersonGraphDataSet, nearly 10 thousand person2person relationship facts that buil ...

  4. BERT辅助金融领域人物关系图谱构建

    摘要 现有的人员简历信息抽取方法无法针对金融公告中非结构化人员简历进行人员属性以及事件的抽取,无法发现金融公告中跨文档的人员之间关系.针对以上问题,将非结构化的人员简历抽取成结构化的人员信息模板,提出 ...

  5. [转载]红楼梦四大家族人物关系图谱(12系列图表)_RWERWERWE_96921_新浪博客

    原文地址:红楼梦四大家族人物关系图谱(12系列图表) 作者: 静心聆听62 红楼梦主要人物关系 01红楼梦四大家族人物关系图谱 02红楼梦人物关系简图 03红楼梦人物关系详图 04红楼梦四大家族奴隶图 ...

  6. Python来袭,教你用Neo4j构建“复联4”人物关系图谱!没有剧透!【文末赠书】...

    讲技术之前先引个好玩的热点话题,带你与时代接轨~ 漫威系列电影<复仇者联盟4>上映 你去看了吗? 小编就盼着周末去好好享受 谁剧透,跟谁急! 复仇者联盟 之 绝对不剧透 漫威英雄们为了不让 ...

  7. 不了解喜欢的明星有什么关系?教你用Neo4j 快速构建明星关系图谱,让你比他自己还了解

    前言 本文将带你用 neo4j 快速实现一个明星关系图谱,因为拖延的缘故,正好赶上又一年的4月1日,于是将文中的几个例子顺势改成了"哥哥"张国荣.正所谓"巧妇难为无米之炊 ...

  8. 用 Neo4j 快速构建明星关系图谱,你一定感兴趣

    今天做一下你们感兴趣的事情,带你们用 neo4j 构建明星关系图谱,这次爬取一下娱乐圈专业的娱乐综合门户网站下载"明星"页的"更多明星"里所有9141条数据. ...

  9. 一文教你用 Neo4j 快速构建明星关系图谱

    更多有趣项目及代码见于:DesertsX/gulius-projects 前言 本文将带你用 neo4j 快速实现一个明星关系图谱,因为拖延的缘故,正好赶上又一年的4月1日,于是将文中的几个例子顺势改 ...

  10. 基于python-django的neo4j人民的名义关系图谱查询系统

    简介 这个系统主要是基于neo4j的关系图谱联系使用 里面的关系是在网上找的数据文件,主要是人民的名义对应关系 首先是吧数据对应的节点和关系写入的neo4j里面 然后使用django编写了一个web服 ...

最新文章

  1. 从numpy开启Python数据科学之旅
  2. FastReport.net分组排序、打印顺序、分页、函数使用语法、数据块编辑
  3. Hadoop 之父:普通程序员到顶级公司 CTO 的进阶之路
  4. 常用的正则表达式的运用--学习笔记(二)
  5. 信息安全官谁:逼近的挑战,你准备好了吗?
  6. Begin to use Tex Example (from others)
  7. linux安装golang!!
  8. Java对象内存布局
  9. oracle多表groupby,Oracle中group by用法
  10. 13.罗马数字转整数-LeetCode
  11. php百度地图api的geocoder,百度地图API提供Geocoder类
  12. JDK环境变量正确设置之后还是不生效
  13. 《微观经济学》博弈论入门:囚徒困境、智猪博弈、性别战、斗鸡博弈
  14. git pull失败解决 git下“The following untracked working tree files would be overwritten by checkout
  15. 分享:你必须知道的H5加速器九大常识!
  16. WIFI认证WPA3
  17. Trident API
  18. Github+Facebook=?这家公司有望让程序猿的头秃得慢一点
  19. 【高级篇 / FortiGate-VM】(6.4) ❀ 04. 虚拟 PC 通过 FortiGate VM 上网 ❀ FortiGate 防火墙
  20. 小程序实战工作的知识点总结

热门文章

  1. 生活中的逻辑谬误06.德克萨斯神枪手
  2. Tangent Space的基向量计算方法
  3. 美图秀秀证件照发现不能用了了,俩个 一寸照片,俩寸证件照 证件照在线的网址记录一下,
  4. egret php交互,JavaScript_Egret引擎开发指南之视觉编程,显示对象和显示列表 “显示 - phpStudy...
  5. 台式计算机用什么网卡,台式机没有网卡怎么办
  6. C#上位机与台达PLC通信,modbus TCP协议。真实使用项目,该程序框架完整,适合在此基础上开发项目
  7. python中实现简单抽样的函数
  8. TVS管选型详细流程
  9. 教你分清敏感度和特异度
  10. 大数据学习教程之java SE 教程