2021-08-09:
POJO类中布尔类型的变量,命名时不要加is,否则部分框架解析时会引起序列化错误。(因为在MySQL中规定表达是与否的值采用is_xxx的命名方式,所以在Mybatis的
中需要设置is_xxx到xxx的映射关系,例如RPC框架在反向解析的时候会对属性名称发生误认的情况,导致属性获取不到,进而抛出异常)。 如果变量值仅在一个范围内变化,且带有名称之外的延伸属性,定义为枚举类。例如:
public enum SeasonEnum {
SPRING(1), SUMMER(2), AUTUMN(3), WINTER(4);
private int seq;
SeasonEnum(int seq) {
this.seq = seq;
}
public int getSeq() {
return seq;
}
}
IDE中的text file encoding设置为UTF-8,文件的换行符使用Unix格式。
当访问一个类的静态变量或静态方法时,直接用类名访问即可,避免通过类的对象引用来访问,这样会无谓地增加编译器的解析成本。
当比较对象时,开发人员通常希望比较对象的属性。然而在没有明确实现equals()方法的类上调用equals()会导致调用继承自Object的equals()方法,该方法比较的是两个对象是否相同,而不是比较成员变量或者属性。
浮点数之间和基本数据类型之间的等值判断不能用==来比较;包装数据类型之间不能用equals()比较。这是因为浮点数采用尾数+阶码的编码方式,二进制无法精确表示大部分的十进制小数。前者可以指定一个误差范围,两个浮点数的差值在此范围之内,则认为是相等的;后者使用BigDecimal来定义值,再进行浮点数的运算操作:
(1)
float a = 1.0f - 0.9f;
float b = 0.9f - 0.8f;
float diff = 1e-6f;
if (Math.abs(a - b) < diff) {
return true;
}
(2)
BigDecimal a = new BigDecimal("1.0");
BigDecimal b = new BigDecimal("0.9");
BigDecimal c = new BigDecimal("0.8");
BigDecimal x = a.subtract(b);
BigDecimal y = b.subtract(c);
if (x.compareTo(y)) {
return true;
}
定义数据对象DO类时,属性类型要与数据库字段类型相匹配。
禁止使用构造方法BigDecimal(double)的方式把double值转化为BigDecimal对象,因为这样存在精度损失风险,推荐使用入参为String的构造方法或者使用valueOf()方法,因为该方法内部执行了Double的toString()方法,即:
BigDecimal recommend1 = new BigDecimal("0.1");
BigDecimal recommend2 = BigDecimal.valueOf(0.1);
所有的POJO类属性必须使用包装数据类型,RPC(Remote Procedure Call)方法的返回值和参数必须使用包装数据类型,所有的局部变量使用基本数据类型。这是因为POJO类属性没有初值是提醒使用者在需要使用时,必须自己显式地进行赋值,任何空指针问题或者入库检查,均由使用者来保证;第二点数据库的查询结果可能为null,因为自动拆箱机制,用基本数据类型接收会有NPE风险。
使用索引访问String的split方法得到的数组时,需要做最后一个分割符号后有无内容的检查,否则有抛出IndexOutOfBoundsException的风险。
不允许在程序的任何地方使用java.sql.Date, java.sql.Time, java.sql.Timestamp。这是因为第一个不记录时间时,getHours()会抛出异常,第二个不记录日期时,getYear()会抛出异常,第三个java.util.Date.after(Date)进行时间比较时,当传入参数为java.sql.Timestamp时,会触发JDK BUG(jdk9已修复)。
2021-08-10:
从SVN上拉代码,搞依赖问题,好像没干啥
2021-08-11:
在导师的指导下获取到了原项目的maven库,直接拷贝作为本地的maven仓库,解决了缺乏相关依赖的问题;由于在pom.xml的
标签和 标签中重复定义了spring-boot-starter的依赖,导致依赖冲突,通过注释掉 中的定义,暂时解决了项目中注解报红的错误。但是后者的注释中提到了数据库加密的作用,在此先记下 maven报错:Dependency is duplicated in file(s): 依赖只需要父pom或者子pom来定义一次就可以了。一般在父类pom中添加依赖就可以了
maven中pom.xml中的parent标签作用是管理多个项目之间的共同依赖:(1)有两个web项目W1、W2,一个java项目J1,依赖同一个jar包:domain.jar。解决办法是在parent项目的pom文件中定义对domain.jar的依赖,W1W2J1三个子项目中只需要定义
,parent标签中写上parent项目的pom坐标就可以引用到domain.jar了。(2)有一个springweb.jar,只有W1W2两个web项目需要,J1项目是java项目不需要。解决办法是在parent项目的pom文件中使用 将springweb.jar管理起来,如果有哪个子项目要用,那么子项目在自己的pom文件中使用
2021-08-12:
-
Cypher中的逻辑运算符比较表:
Cypher中,null代表丢失或者未定义的值
a[coalesce($lower, 0)..coalesce($upper, size(a))]
做图嵌入方法的调研脑图
2021-08-13:
查找梳理总结各种知识图谱嵌入算法特点,绘制脑图
2021-08-16:
搜集整理各大厂商的知识图谱表述学习在反欺诈和反洗钱的应用进展
2021-08-17:
绘制知识图谱风控项目的结构脑图
2021-08-18:
javax.persistence.Id //说明是主键(@Id此注解不能省略)
@GenerateValue(generator = "S_USER_ID") //主键的生成方式
@Table(name = "USER") //指定数据库对应的表
@Column(name = "USER_NAME") //数据库字段和类属性对应关系
@EntityListeners表示对实体属性变化的追踪,他提供了保存前,保存后,更新前,更新后,删除前,删除后等状态,就像是拦截器一样,可以在拦截方法里面重写个性化逻辑
@Embedded注解表示它是一个内嵌到当前实体的对象,它本身不是实体,它只表示实体里的某些字段
@Embeddable注解表示不会生成新的数据表,而它的属性会在其他表的内部,比较容易实现代码复用
@Transactional注解表示启用事务管理功能一个数据库表中不能有两个及两个以上的主键,但是允许多个字段联合组成主键
dbentity包中一个具体的实体类延伸的诸如Key/Base/RealRelation/RelationGenealogy/Tmp变体之间互相嵌套是为了什么;类名前缀为KgpZSZH的类大多对应着具体的数据库表,每个字段的具体含义一知半解;
Scheduler(调度器)是Quartz框架的心脏。其生命周期始于通过ScheduleFactory工厂类创建实例,终于shutdown()方法。Scheduler不仅可以用于新增、移除、和列举Jobs和Triggers,还可以执行调度相关工作,比如暂停Trigger,恢复Trigger等。主要注意的是,直到调用start()方法时,Scheduler才开始执行Job和Trigger。Job(作业)是指执行一些作业的特定的Java类。Job必须实现org.quartz.Job接口,这个接口要求在Job中实现excute()方法。当Quartz调用excute()方法,会传递一个JobExecutionContext上下文变量,里面封装有Quartz的运行环境和当时正在执行的Job。JobExecutionContext可以被用来访问JobDetail类,该类持有Job的详细信息,包括为Job实例指定的名称,Job所属组,Job是否被持久化。JobDetail持有一个指向JobDataMap的引用,JobDataMap中包含Job配置的自定义属性。Trigger(触发器)用于触发Job的执行,最常用的类型包括SimpleTrigger和CronTrigger。
2021-08-19:
调研总结多模态相关的资料文档
2021-08-20:
撰写多模态调研报告
2021-08-23:
看repository这个包,里面有sql,有cypher,都看了看,晚上看视频学spring-batch
2021-08-24:
连接项目的mysql和neo4j的数据库;看完了spring-batch教程
2021-08-25:
粗略地看了项目中除batch以外的所有包;继续撰写整理调研报告
2021-08-26:
修改调研报告
2021-08-27:
继续修改补充
2021-08-30:
GoodsKG:本项目以京东电商为实验数据来源,采集京东商品目录树,并获取其对应的底层商品概念信息,组织形成商品知识图谱。目前,该图谱包括有概念的上下位is a关系以及商品品牌与商品之间的销售sale关系以及部分混合关联关系,涉及商品概念数目1300+,商品品牌数目约10万+,属性数目几千种,关系数目65万规模。
AliCoCo:阿里的认知概念商品图谱挺强的,由机器学习和人工协作构建而成,包含了285万个原始概念和526万个电子商务概念,3亿多个实体项目,4千亿个关系。但是不开源.........
亚马逊也有一个商品知识图谱,名字叫Product Knowledge Graph,看了两篇相关论文也没公开数据集
2021-08-31:
- 百分点这个用户画像数据集是四年前的数据集,所以每一行第一项的商品具体信息会不可避免地不适应现在的电商推荐;能够与京东数据集互补的是每一行的品牌信息与类目信息,这两项信息对时间不太敏感,但是这两个数据并不是每一行都有,而且每一行的数据格式不统一,所以融合两个数据集需要大量的人工操作。
- Neo4j 4.0新特性:(1)在独立服务器或因果群集中,每个服务器实例支持多个数据库(multi-databases),以实现对数据的物理隔离和分布式存储(即“分库”、"分图")。(2)增强的Cypher特性支持对跨数据库的读取操作,写入操作仍然限于单个数据库。(3)新增的Neo4j Fabric服务器可以在Cypher查询中对分片(跨数据库、跨集群)的数据库进行查询,类似“联邦式查询(Federated Query)”。
- 讨论如何实现基于知识图谱的精准搜索,讨论结果是基于word2vec词向量模型训练出知识图谱的每个节点特征,然后query送入该分类器中直接匹配相似实体,加快cypher的匹配搜索速度
2021-09-01:
- 知识图谱的关键字搜索:经典的解决方案是Group Steiner Tree,即大致确定每个关键字的匹配项,然后根据适当的接近度概念(eg,最短的连接路径)组合匹配项。19年一篇论文提出的WikiSearch引入了一个称为最小激活层次的约束,该约束是节点命中级别的下限,即在满足该约束条件之前无法命中节点。这样可以让命中级别反映关键字和节点之间的语义相关性。该激活层的计算方法如下:
(1)由观察发现,具有大量相同标记边的节点往往是汇总节点,并且是往往导致无意义的连接捷径。汇总度越大,就说明该节点相对其他节点可能包含的信息量就越少:
节点的汇总度就是将所有边上的平均值视为该节点的总汇总度。其中通过平均所有边,考虑了边标签的多样性,也就是说如果节点具有许多不同的边标签,即使他具有相对大量的边,它可能仍然具有意义。
(2)通过奖惩映射获得最小激活层次,并有一个可调参数α 使用户能在运行时设置汇总度的偏好。该映射策略的直觉是授予有信息量的节点以较小的权重和更低的激活层级,使他们具有高于汇总节点的搜索优先级。奖惩映射首先通过采样计算图中随机两节点之间的平均距离,然后,根据节点和 α 的权重,我们通过在一定程度上增加(惩罚)或减少(奖励)平均距离来计算激活层级。这样,我们可以使激活层级 在合理的范围内来控制搜索。
(3)在搜索过程中,激活层次小的节点将变为激活状态,可以在早期进行搜索。当没有更好结果时,可以返回上一激活层级进行搜索。 - 安装neo4j 4.0和运行一个spring-data-neo4j项目,期间配置了jdk11,熟悉了windows的jdk环境变量配置以及maven的jdk版本修改方法(File->Projrct Structure->SDKs->选择JDK home PATH即可)
2021-09-02:
1.Neo4jClient是neo4j的java驱动上面薄薄的一层,并不会和应用级别的事务勾搭在一起。结合项目代码看spring-data-neo4j开发手册的API。
2.VO(View Object):视图对象用于展示层,作用是把某个页面所有的数据封装起来;DTO(Data Transfer Object)数据传输对象,用于展示层和服务层之间的数据传输对象;DO(Domain Object)领域对象,指从现实世界中抽象出来的业务实体;PO(Persistent Object)持久化对象,是和持久层的数据结构形成以一一对应的映射关系,如果持久层是关系型数据库,那么表中的每个字段就对应PO中的每个属性。具体的流程如下所示:
- 用户发出请求(可能是填写表单),表单的数据在展示层被匹配为VO。
- 展示层把VO转换为服务层对应方法所要求的DTO,传送给服务层。
- 服务层首先根据DTO的数据构造(或重建)一个DO,调用DO的业务方法完成具体业务。
- 服务层把DO转换为持久层对应的PO(可以使用ORM工具,也可以不用),调用持久层的持久化方法,把PO传递给它,完成持久化操作。
- 对于一个逆向操作,如读取数据,也是用类似的方式转换和传递,略。
2021-09-03:
1.在Windows下使用python的py2neo库,会报OverflowError: mktime argument out of range错误。因为windows的时间戳是由int类型保存的,所以时间戳的最大值就是2147483647,也就是说时间戳的范围不能早于midnight, January 1, 1970,不能晚于23:59:59 January 18, 2038。超过localtime()这个C函数提供的范围,非POSIX系统(简单理解为类Unix操作系统)就会报错。我直接去它库里找到报错的文件代码,直接注释掉了,反正我就插几条数据,跟时间又没关系,哈哈哈哈,解决不了问题,我直接把提出问题的你给解决了
- 往neo4j里面插cypher,65万条关系插了特么6个多小时,还没全抽进去,不知道是关系重合了还是咋回事儿,而且有学习批处理插入操作的需求
2021-09-06:
1.模仿demo项目写测试接口
2.写neo4j 4.3版本新特性报告
2021-09-07:
- 导入demo项目的movies数据库,结合具体数据理解demo项目的查询封装操作
- 分析电商部门的数据,学习csv批量导入
CREATE CONSTRAINT ON (exchange:Exchange) ASSERT exchange.exId IS UNIQUE
:AUTO USING PERIODIC COMMIT 10000
LOAD CSV WITH HEADERS FROM 'file:///exchange.csv' AS line
Create (:Exchange {name:line.name, chinesename:line.chinesename, id:line.id})
CREATE CONSTRAINT ON (stock:Stock) ASSERT stock.stId IS UNIQUE
:AUTO USING PERIODIC COMMIT 10000
LOAD CSV WITH HEADERS FROM 'file:///Stocks.csv' AS line
Create (:Stocks {name:line.name, cocode:line.cocode, id:line.id})
:AUTO USING PERIODIC COMMIT 10000
LOAD CSV WITH HEADERS FROM 'file:///Stocks_exchange.csv' AS line
MATCH (stock:Stocks {cocode:line.stock_code}),
MATCH (exchange:Exchange { id: line.exchange_id })
MERGE (stock) -[r:交易所]->(exchange)
2021-09-08:
1.修改电商数据文件的编码格式
- 在Lunix上部署neo4j 4.3.3,遇到了一个ServiceUnavailable的错误,上网查问题发现是当有远程的浏览器连接请求发来,进行身份验证时会出此错误,解决方法是去conf文件中把bolt协议的一行注释解开,在:7687前面加上0.0.0.0
dbms.connector.bolt.enabled=true
dbms.connector.bolt.listen_address=0.0.0.0:7687
dbms.connector.bolt.advertised_address=0.0.0.0:7687
- netstat -nultp 查看端口服务
4.把电商数据的所有节点导进了neo4j
2021-09-09:
1.把电商数据的关系导进了neo4j
2.写知识图谱应用与挑战报告
2021-09-10:
1.在公司内网运行demo项目编译的时候遇到了Disconnected from the target VM, address....找不到或无法加载主类的问题,原因是我自己在导入项目到IDEA中时,直接从idea的工作空间中导入到了工作空间中,人家导入的时候就询问了是否要覆盖,我特么还选了是.......导致工作空间被篡改了,所以肯定就找不到启动类了啊
2.写了一个查询API,调试成功
2021-09-13:
1.编写接口测试4.3版本的neo4j是否支持对不同数据库进行查询操作,测试结果可行
2.画监管数据ppt
2021-09-14:
1.Windows查看端口被进程ID占用的命令:netstat -aon|findstr "8080"
Linux查看端口被占用的命令:netstat -anp|grep 8080
2.testcontainer简单理解就是可以通过编程语言启动Docker容器,并在程序测试结束后,自动关闭Docker。
3.调整项目冲突的过程中发现当升级到JDK11时,项目无法启动并报警告:An illegal reflective access operation has occured,原因是新版本JDK中的module system(模块系统)对jdk中的模块进行了反射检查,凡是反射了JDK中的类的操作都会被警告,老项目里面hibernate的session会话把实体类保存到数据库的操作是出了名的反射机制,oracle官网文档说要想继续在新版本上启动,就得用--add-opens在VM配置中,csdn上面有人盖了下面这坨东西:
--add-opens java.base/sun.nio.ch=ALL-UNNAMED
--add-opens java.base/java.io=ALL-UNNAMED
--add-opens java.base/java.lang=ALL-UNNAMED
--add-opens java.base/java.util=ALL-UNNAMED
--add-opens java.base/java.lang.reflect=ALL-UNNAMED
--add-opens java.base/java.text=ALL-UNNAMED
--add-opens java.desktop/java.awt.font=ALL-UNNAMED
但是我在项目里面添了这些东西还是不够,控制台报错的内容里我看见有跟hibernate相关的类,内容好像是说无法拿到持久化里面的entity.SingleTableEntityPersister这个类的构造器,进而无法构建会话工厂
4.多态:多态是针对而言的,一个对象的实际类型是确定的,但是指向这个对象的引用类型就不确定了,举例来说就是父类的引用可以指向子类
2021-09-15:
1.Hibernate的反射机制:
- 先根据查询条件构造PreparedStatement语句,该语句会返回从数据库查询到的属性值
- 通过读取User类的配置文件获取该类的属性列表list(String列表)和每个属性的类型
- 创建User的实例对象myUser
- 写for循环,循环次数是list.length:
- 读取list[i]的值,然后写该属性的set方法
- 判断list[i]的类型,调用PreparedStatement中的get方法得到该字段的值
- 将3中得到的值作为参数传到1的set方法里面,这样就完成了一个字段向一个属性的赋值
- 如此循环即可
- 反射是在运行时才知道要操作的类是什么,并且在运行时才获得类的完整构造,并调用对应的方法
package movies.spring.data.neo4j.nodes;
import movies.spring.data.neo4j.movies.Movie;
import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
public class ReflectTest {
public static void main(String[] args) throws ClassNotFoundException, NoSuchMethodException, IllegalAccessException, InvocationTargetException, InstantiationException {
//正射
JinDoll doll = new JinDoll();
doll.setName("六合");
System.out.println("正射:" + doll.getName());
//反射
Class clz = Class.forName("movies.spring.data.neo4j.nodes.JinDoll");
Method setNameMethod = clz.getMethod("setName", String.class);
Constructor dollConstructor = clz.getConstructor();
Object dollObj = dollConstructor.newInstance();
setNameMethod.invoke(dollObj, "秘雕");
Method getNameMethod = clz.getMethod("getName");
System.out.println("反射:" + getNameMethod.invoke(dollObj));
}
}
上面写代码的过程之中一开始是想反射一个构造函数是有参的类的,但是写到clz.getConstructor()这一部IDEA就没报错,但是既然是反射有参,你在获取被反射类的完整构造时就得传入所有参数的类型,不然编译的时候还得报NoSuchMethodException的错误,后面newInstance()时候又报错了,这我就懒得解决了,直接写了一个默认构造是无参的类,反射测试一下完事儿,后面看狂神的视频看看他教没教咋反射有参构造的类吧......
- JPA全称Java Persistence API,即Java持久化接口,通过注解或xml描述对象与表之间的映射关系,并将运行期的实体对象持久化到数据库中。JPA和Hibernate的关系可以简单理解为JPA是接口,Hibernate是实现,但是并不是单一的对标关系。Hibernate不仅遵循JPA的规范,还遵循其他标准的规范。举个例子,JPA是一种做面条的规范,那么Hibernate就是遵循JPA规范做成的一碗汤面,但是汤面不仅遵循面条的规范,他还遵循汤和调料的其它规范。
- 老项目只要拿JDK11跑,依赖就会报各种各样的错误,拿JDK8就没事儿
2021-09-16:
1.RedisGraph之所以查询速度快,是因为他用了Hexastore稀疏矩阵把图存储在内存中
2.上午调研RedisGraph,看github官网文档;下午安装Ubuntu虚拟环境准备测试RedisGraph
2021-09-17
1.Linux显示当前路径: pwd
查看磁盘空间:df -hl
查看服务状态: ps -ef|grep redis
vim快速查找: /你想找的字符串 或者 ?你想找的字符串
2.用VMware配置了下虚拟机,熟悉了下Ubuntu的复制,删除,下载软件的命令,配个了清华镜像
2.git clone RedisGraph一天都clone不下来,最后靠着敬之哥的VPN clone下来了
2021-09-18
1.make工具是通过makefile文件来描述大型项目的源程序之间的依赖关系并自动维护编译工作。
死活就是make不成功啊,我也很绝望啊
- 重新安装了redis6.2.5版本
⣿⣿⣿⣿⣿⣿⣿⣿⣿⠻⢿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠹⢿⣿⣿⣿⣿⣿⡿⠋⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠈⠻⣿⣿⡿⠏⠀⠀⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⠀⠀⠀⠀⠀⠙⠋⠀⠀⠀⢀⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣷⡈⠉⠉⠉⠉⠉⠀⣀⡤⠴⠶⠶⠶⠤⣄⡀⠸⠿⠿⠛⢛⣿⣿
⣿⣿⣿⣿⡄⠀⠀⠀⣰⠚⠁⠀⠀⠀⠀⠀⠀⠀⠳⣄⠀⠀⢠⣾⣿⣿⣿⣿
⣿⣿⣿⣿⣷⠀⠀⡜⠁⠀⠀⠀⠀⣀⣀⣀⣀⣀⣀⠘⡆⢠⣿⣿⣿⣿⣿
⣿⣿⠿⠛⠉⠀⢰⠇⠀⠰⣾⡯⠭⠭⣭⠭⡭⠭⠭⠭⢿⡀⠙⠿⣿⣿
⣿⣤⣀⠀⠀⠀⢸⠀⢠⣧⣤⣤⣤⠤⢼⣾⠥⣤⡤⠤⠬⡇⣠⣴⣾⣿
⣿⣿⣿⣿⡦⠀⢸⠀⠈⢧⡀⠁⠀⠀⡠⠛⣄⠈⠀⢀⣠⠇⣿⣿⣿⣿
⣿⣿⠿⠋⠀⠀⣸⡄⠀⢤⣉⠓⠚⠋⠁⡀⢸⡩⣯⡭⢿⡀⠙⠿⣿⣿
⣿⣷⣤⣄⡀⢼⠋⠀⠀⠀⠉⠉⠁⠀⠀⠳⣼⠇⠀⠀⣼⢹⣾⣿⣿⣿⣿
⣿⣿⣿⣿⡟⠈⠳⣤⠀⠀⡀⠀⠀⣀⣀⣀⣀⣀⡀⠀⣿⡻⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣾⣿⣿⠞⣆⠸⡇⠚⠉⠁⠀⣿⣿⡟⠉⢁⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣶⣿⣆⠈⠁⠀⠰⡖⠙⠛⠃⣠⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⡦⣄⣀⣀⣠⣴⣾⣿⣿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⣿⡿⠿⠟⠛⡛⢷⣤⣀⣠⢾⣛⠛⠿⢿⣿⣿⣿⣿⣿⣿
⣿⣿⣿⣿⣿⠃⠀⠀⠀⢰⠃⢸⠀⠀⠀⠘⡟⣆⠀⠀⢹⣿⣿⣿⣿⣿⣿
3.redis高级方法:
set key value;get key;keys *;exists key;append key "xxx";expire key secongds;strlen key;incr key
- setex和setnx完成分布式锁的操作
set object:id:field value 例如:set article:999:views 23 设置第999篇文章的浏览量为23
getset db redis 先get再set如果不存在值,则返回null;如果存在值,则获取返回原来的值,再设置新的值
lpush list value;lrange list 0 -1;rpush list value;lpop list value;lindex list integer;llen list;lrem list n value;ltrim list 1 2;rpoplpush list1 list2移除列表最后一个元素,将其移动到另一个列表中;lset list n value;linsert list before/after value1 valu2
sadd myset value;smembers myset;sismember myset value;scard myset;srem myset value;srandmember myset n;spop myset;smove myset anotherset value;sdiff set1 set2;sinter set1 set2;sunion set1 set2
zadd salary 2500 zhangsan;zrangebyscore salary -inf +inf;zrevrange salary - -1;zrange salary 0 -1;zrem salary zhangsan;zcard salary;zcount salary value1 value2
geoadd china:city 120.16 30.24 hangzhou;geopos china:city hangzhou;geodist chinaLcity shanghai hangzhou km;georadius china:city 110 30 500 km withdist;georadiusbymember chaina:city hangzhou 500km;zrange china:city 0 -1
pfadd mykey a b c d e f g h;pfcount mykey;pfmerge key3 key1 key2
setbit sign 1 0;getbit sign 1;bitcount sign
- Redis事务没有隔离级别的概念,它的单条命令保证原子性,但是事务不保证原子性。multi开启事务、exec执行事务、discard放弃事务。当redis事务中遇到了编译型异常(例如语法错误)时,事务中的所有命令都不能被执行;当遇到了运行型异常其他命令是可以正常执行的。
- Redist通过watch对key进行监视加锁,是一种乐观锁。当一个线程执行之前,有另外一个线程修改了被watch的值,那这个时候就会导致事务执行失败
2021-09-22
- Ubuntu虚拟机配置桥接模式:
- 编辑虚拟网络编辑器更改设置桥接至网卡(自己打开电脑设置里面的网络和Internet的以太网,再点更改适配器设置,自己看网卡是哪个就选哪个)
sudo vi /etc/netplan/01-netcfg.yaml
在这个文件中按照 yaml 的格式写入如下内容:
network:
version: 2
renderer: NetworkManager
ethernets:
ens33:
dhcp4: no
addresses: [192.168.13.210/24] //静态ip,前三位和主机一样,最后一位不一样即可
gateway4: 192.168.13.122 //网关
nameservers:
addresses: [101.226.4.6] //DNS
填写完毕:wq退出
执行netplan apply如果没有报错,则说明设置成功。
- 然后主机去ping虚拟机的ip,ping通应该就没啥问题了
- gcc一开始的全称是GNU C Complier,后来由于这个项目越来越大,就成了GNU Complier Collection,从名称的改变就可以理解最初是只能编译c,后来还能编译c++和其他的语言了。
- redis.conf修改了内容不能生效解决办法:
sudo ./redis-server /opt/redis-6.2.5/redis.conf
2021-09-23
- github国内镜像网站:https://github.com.cnpmjs.org/
- neo4j匹配项目时对大小写是敏感的。。。。。
match (four:ForthGrade) where four.cateName contains 'MacBook' return four
macth (four:ForthGrade) where four.cateName contains 'macbook' return four
上面这两个cypher查出来的东西不一样.........
match (four:ForthGrade) optional match (four)<-[*1..4]-(n) where four.cateName contains '好想你' return n
match (four:ForthGrade)-[r:INCLUDE]->(five:FifthGrade) where four.cateName contains '好想你' with four,five order by four.cateId,five.cateId return four.cateName as lead, collect(five.cateName) as follows
2021-09-24
- neo4j.conf配置文件:
dbms.memory.heap.initial_size:JVM的初始堆大小
dbms.memory.heap.max_size:JVM堆的最大容量
dbms.jvm.additional:针对JVM的额外可选项设置
- Neo4j的集群中单例模式有数据丢失的风险(这不废话吗,一台主机坏了还能死而复生的?);核心模式使用Raft协议保证对所有的事务复制,这样做的效果就是如果核心主机中的大部分(二分之N再加一)主机已经接收了事务,那么数据就安全了。如果要考虑容错,那就得部署2F+1台核心主机,F为容错台数。
- 在执行事务的过程中,客户端可以请求一个名为bookmark的标志,这个标志会作为下一个事务的参数。这样集群就可以保证只有处理过该客户端事务的服务器才能去跑这个客户的下一条事务。而不是说同一个客户端的不同事务是不同的服务器去执行,那样就乱套了。
2021-09-26
- /etc/profile //此文件为系统的每个用户设置环境信息
~/.bash_profile //每个用户都可以使用该文件的配置信息 - linux上安装neo4j4.3:
- 先安装jdk11,解压以后记住路径再去~/.bash_profile里面添加环境变量,:
export JAVA_HOME=home/jdk-11.0.12 //你自己的安装路径
export PATH=${JAVA_HOME}/bin:${JAVA_HOME}/jre/bin:$PATH
- 再解压安装neo4j4.3,安装好了以后去配置文件里面把下面这行注释解开就行,$\:
dbms.default_listen_address=0.0.0.0
- 部署neo4j集群,部署了一天都不行,按照官网上安回来,安回去都不行
2021-09-27
- 查找资料看neo4j官网说是由于存储ID不匹配造成的存储复制失败,建议的解决方法是先解绑(把集群状态移除并存档),然后把graph.db移除,再从另一台核心服务器上恢复,然后再启动,待尝试......
- 下午在209上导了三个小时数据,是因为建约束的时候没加create关键字,读csv文件时候记混了列名
2021-09-28
1.继续尝试部署集群
2.给前端写接口
2021-09-29
今天把昨天要写的接口写完了,呜呜呜,真辛苦
2021-09-30
美团用的图数据库是NebulaGraph,由Facebook员工叶小萌离职创业在19年推出,基于C++编写,存储引擎基于RocksDB改造。在每秒几十万的导入速度下,会长期占用机器的CPU、IO资源,一方面会对机器机器造成损耗,另一方面数据导入过程中集群对外提供的读性能也会变弱。针对上述两个问题,美团做出了两个优化措施:1.在Spark集群中直接生成图数据库底层文件SST file2.再借助RocksDB的BulkLoad功能ingest文件到数据库
2021-10-07
六爻解卦时看动爻:
- 一个动爻:直接按动爻的爻辞解卦即可
- 两个动爻:一阴一阳观阴爻;同阴同阳观上爻
- 三个动爻:观中爻
- 四个动爻:自下而上,取第一个不动的爻
- 五个动爻:看不动的爻
- 六个动爻:找本宫卦的卦辞
2021-10-08
1.搭建Neo4j 4.3集群(我的三台服务器是209,210,211):
- 首先保证每台服务器上都装了jdk11,配了环境变量;
- 然后在每台服务器上解压neo4j 4.3,最好每台服务器上的解压路径都一样,方便操作维护;
- 其次修改每台服务器的neo4j.conf文件,我在别的博客和官网上看教程,那些ip配的乱七八糟的,就是配不好,最后把每台服务器上的neo4j卸载重装以后按照枫叶小哥的博客配好了,下面的配置文件不多也不少,就改这些就行了,反正我是配好了:
解开注释
dbms.memory.heap.initial_size=512m
dbms.memory.heap.max_size=512m
解开注释并修改
dbms.default_listen_address=203.3.234.209 //当前服务器ip
dbms.default_advertised_address=203.3.234.209
dbms.mode=CORE
causal_clustering.minimum_core_cluster_size_at_formation=3
causal_clustering.minimum_core_cluster_size_at_runtime=3
causal_clustering.initial_discovery_members=203.3.234.209:5000,203.3.234.210:5000,203.3.234.211:5000
causal_clustering.discovery_listen_address=:5000
causal_clustering.transcation_listen_address=:6000
causal_clustering.raft_listen_address=:7000
-
最后启动每台服务器的neo4j,顺序无所谓,启动之后去浏览器地址栏输入每台服务器的ip加上7474端口访问即可,配置成功截图如下:
2021-10-09
- redis如果主机宕机了,那
slaveof no one
可以让当前从机谋权篡位变为老大 - 哨兵配置文件:sentinel.conf:
sentinel monitor 127.0.0.1 6379 1
,后面的数字1表示如果主机挂了,就开始投票模式选举新的主机 - 缓存穿透:用户想要查询一个数据,发现redis数据库没有,于是向持久层数据库查询。发现也没有,于是本次查询失败。当用户很多的时候(例如),大面积缓存都没有命中,于是都去请求了数据库,这会给持久层数据库造成很大的压力,此时就会出现缓存穿透现象。解决方案有布隆过滤器和缓存空对象。前者对所有可能查询的参数以hash形式存储,在控制层先进行校验,不符合直接丢弃,从而避免了对底层存储系统的压力;后者是当存储层不命中时,即使返回为空对象也将其缓存起来,同时设置一个过期时间,之后再访问这个数据会从缓存中获取,保护了后端数据源。
- 缓存击穿:是指一个非常热点的key(例如),在不停扛着大并发。大并发集中对这一个点访问,当这个点在失效的瞬间,有大量的并发请求,由于缓存过期,会同时访问数据库来查询最新数据,并回写缓存,使数据库压力瞬间过大。解决方案有设置热点key永不过期和加互斥锁。其中加互斥锁是保证对于每一个key同时只有一个线程去查询后端服务,其他线程没有获得分布锁的权限,因此只需等待即可。这种方式将高并发的压力转移到分布式锁,对分布式锁的考验很大。
- 缓存雪崩:是指某一个时间段内,缓存集中过期失效,redis宕机。其实集中过期,倒不是非常致命,致命的是缓存服务器某个节点宕机或者断网。
- lambda的演变史:定义函数式接口实现类静态内部类局部内部类匿名内部类lambda表达式
2021-10-11
- 上午学习java分页,原理就是用SQL的limit字段实现的,接收两个参数,第一个是偏移量,第二个是当前语句返回的记录条数;但是Cypher的limit只接受一个参数,只能去限制一下返回记录的大小,分页我目前想到的是用where去限制搜索条件达到类似的分页效果;
- 下午开会明确了下一步要进行集群的路由配置,我感觉这东西不仅需要在neo4j.conf里面配,还需要在项目的sdn配置文件里面配;除此之外,梳理了一下自己接下来的分工:session查询和注解查询比较;自动补全搜索策略的制定;以代码的方式进行定期load csv操作;之前调研报告整成word版本;学svn基本操作。
2021-10-12
-
neo4j-admin unbind --database=graph.db
常用于解决集群服务器中数据不一致的问题;对于只读的事务,驱动可以自动路由至从机;应用层访问不要要判断主节点,驱动会自动切换和实现 - neo4j的堆内存建议设置为OS总内存的30%,页面缓存大小设置为OS总内存的50%,官方的建议配置命令为
neo4j-admin memrec --database=graph.db
- neo4j数据预热:
match (n) optional match (n)-[r]->() return count(n)+count(r)
- 如果有确定的目标,应该先匹配目标再去匹配路径
- 图数据库里尽量不要出现环路和双向关系,十分影响查询性能
2021-10-13
- neo4j集群模式不支持
neo4j-import
导入,因为该命令是在单节点且服务停止的情况下使用。如果在集群模式下停止服务并导入,集群需要重建:
如果只做一次初始化,正确步骤为:- 停止服务,导入到一个单节点
- 导入完成后启动服务,检查数据是否正确
- 停止服务,进行数据备份
- 搭建两个新的从节点,将数据备份到从节点,并进行restore
- 配置集群关系,启动集群
如果需要经常初始化且数据量较大,建议使用单节点模式;
如果需要经常初始化但数据量较少,建议使用在线批量插入方式
- neo4j的database被stop后是处于停用状态的,此时集群中的Raft协议的作用对象也就不会包含该database,所以在进行灾难恢复时要对此类状态的数据库单独考虑恢复方案;
- 命令行连接数据库,添加角色及权限 :
./cypher-shell -a neo4j://203.3.234.209:7687 -d system -u neo4j -p Passw0rD
call dbms.security.listRoles()
call dbms.security.createUser('ejy','Passw0rD',false)
call dbms.security.addRoleToUser('reader','ejy')
call dbms.security.removeRoleFromUser('reader','ejy')
2021-10-14
- 学习session会话,Query注解,neo4jClient客户端三种查询方式,结合目前查到的路由实现方式,还是得用session会话查询
- 将集群路由以读取配置文件的方法在项目中进行了代码实现
2021-10-15
- 将新的数据导入到了集群中,节点数量为59万,关系数量为109万
match (n:Brand) set n.brandName = n.goodsName remove n.goodsName
2021-10-18
- cron表达式参数含义:
秒分小时日期月份星期年份(可选,留空)
每一个域都使用数字,但还可以出现如下特殊字符,它们的含义是:
(1):表示匹配该域的任意值。假如在Minutes域使用, 即表示每分钟都会触发事件。
(2)?:只能用在DayofMonth和DayofWeek两个域。它也匹配域的任意值,但实际不会。因为DayofMonth和DayofWeek会相互影响。例如想在每月的20日触发调度,不管20日到底是星期几,则只能使用如下写法: 13 13 15 20 * ?, 其中最后一位只能用?,而不能使用,如果使用表示不管星期几都会触发,实际上并不是这样。
(3)-:表示范围。例如在Minutes域使用5-20,表示从5分到20分钟每分钟触发一次
(4)/:表示起始时间开始触发,然后每隔固定时间触发一次。例如在Minutes域使用5/20,则意味着5分钟触发一次,而25,45等分别触发一次.
(5),:表示列出枚举值。例如:在Minutes域使用5,20,则意味着在5和20分每分钟触发一次。
(6)L:表示最后,只能出现在DayofWeek和DayofMonth域。如果在DayofWeek域使用5L,意味着在最后的一个星期四触发。
(7)W:表示有效工作日(周一到周五),只能出现在DayofMonth域,系统将在离指定日期的最近的有效工作日触发事件。例如:在 DayofMonth使用5W,如果5日是星期六,则将在最近的工作日:星期五,即4日触发。如果5日是星期天,则在6日(周一)触发;如果5日在星期一到星期五中的一天,则就在5日触发。另外一点,W的最近寻找不会跨过月份 。
(8)LW:这两个字符可以连用,表示在某个月最后一个工作日,即最后一个星期五。
(9)#:用于确定每个月第几个星期几,只能出现在DayofMonth域。例如在4#2,表示某月的第二个星期三。
三、常用表达式例子
(1)0 0 2 1 * ? * 表示在每月的1日的凌晨2点调整任务
(2)0 15 10 ? * MON-FRI 表示周一到周五每天上午10:15执行作
(3)0 15 10 ? 6L 2002-2006 表示2002-2006年的每个月的最后一个星期五上午10:15执行作
(4)0 0 10,14,16 * * ? 每天上午10点,下午2点,4点
(5)0 0/30 9-17 * * ? 朝九晚五工作时间内每半小时
(6)0 0 12 ? * WED 表示每个星期三中午12点
(7)0 0 12 * * ? 每天中午12点触发
(8)0 15 10 ? * * 每天上午10:15触发
(9)0 15 10 * * ? 每天上午10:15触发
(10)0 15 10 * * ? * 每天上午10:15触发
(11)0 15 10 * * ? 2005 2005年的每天上午10:15触发
(12)0 * 14 * * ? 在每天下午2点到下午2:59期间的每1分钟触发
(13)0 0/5 14 * * ? 在每天下午2点到下午2:55期间的每5分钟触发
(14)0 0/5 14,18 * * ? 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发
(15)0 0-5 14 * * ? 在每天下午2点到下午2:05期间的每1分钟触发
(16)0 10,44 14 ? 3 WED 每年三月的星期三的下午2:10和2:44触发
(17)0 15 10 ? * MON-FRI 周一至周五的上午10:15触发
(18)0 15 10 15 * ? 每月15日上午10:15触发
(19)0 15 10 L * ? 每月最后一日的上午10:15触发
(20)0 15 10 ? * 6L 每月的最后一个星期五上午10:15触发
(21)0 15 10 ? * 6L 2002-2005 2002年至2005年的每月的最后一个星期五上午10:15触发
(22)0 15 10 ? * 6#3 每月的第三个星期五上午10:15触发
- @Scheduled使用方法
先在启动类上面添加@EnableScheduling
然后在方法上面添加@Scheduled(cron = "30 * * * * ? ")
2021-10-19
- 今天商讨搜索策略,目前领导要求的是把每一个四类商品的全称进行分词然后精简作为属性添加存储到该节点中。我想的是直接用query模糊匹配四类节点,然后把查出来的所有goodsName进行分类映射,然后把分类结果作为自动补全的返回值。
2021-10-20
- 按照昨天的思路写了一个自动补全的接口,先分词然后模糊匹配
2021-10-21
- 今天白天看了京东电商搜索的逻辑,晚上和雷领搞ltp4j,没搞出来
2021-10-22
- Qt是基于C++的跨平台应用程序开发框架,有着独特的信号和槽机制。专注但不局限于图形用户界面的开发,也可以进行系统调用、网络编程、数据库的开发。
- Qt中有两种编译方式,分别为MSVC和MinGW。其中MSVC是微软的C++编译器,微软的亲儿子;MingGW是GNU从Linux移植到Windows上的产品。两者把源码编译打包成exe文件的方式不同,体验上来讲MinGW快一丢丢,但是MSVC更稳。前者不想钻研的话直接下载VS2015勾选Visual C++安装即可,后者(1)去官网下载安装程序或者(2)压缩包解压再配下环境变量都可以。
- ltp4j编译过程(windows版本):
- 确认已安装了maven和git以及msvc,前两者确认命令mvn -v和git --version
- git clone https://github.com/HIT-SCIR/ltp4j
- 进入到ltp4j文件夹下git submodule init
- git submodule update
- mvn -Dmaven.test.skip=true
在下面的文件夹能找到一下文件就说明编译成功
target/ltp4j-0.1.0-SNAPSHOT.jar
target/nar/ltp4j-0.1.0-SNAPSHOT-amd64-Windows-msvc-jni/lib/amd64-Windows-msvc/jni/ltp4j-0.1.0-SNAPSHOT.dll。
- ltp4j使用过程:
- 先把jar包打到maven库里面:
mvn install:install-file -Dfile=D:\LTP\ltp4j\target\ltp4j-0.1.0-SNAPSHOT.jar -DgroupId=edu.hit.ir.ltp4j -DartifactId=ltp4j -Dversion=0.1.0-SNAPSHOT -Dpackaging=jar
- 然后因为ltp是C++写的,这里只是整合成了java的native方法,不指定library_path的话会找不到动态链接库,接着会报java.lang.UnsatisfiedLinkError的错误,解决办法是直接把生成的dll文件放到jdk下面的bin目录就行,(根本原因就是在类路径里面找不到ltp4j这个库嘛,那加进去就行了)
- 再把
edu.hit.ir.ltp4j
ltp4j
0.1.0-SNAPSHOT
写到pom文件里去
- 模型文件在ltp4j文件夹下面的ltp_data中有,写代码的时候写绝对路径和相对路径都可以。基本用法见文档:https://ltp4j.readthedocs.io/en/neoltp4j/
- JNI(java native interface)是java和C与C++之间进行通信的桥梁。native方法就是JNI实现的(此实现非是java中的实现)
- dll是动态链接库文件,是一种不可执行的二进制程序文件,允许程序共享执行特殊任务所必须的代码和其他资源。利于节省内存,资源共享,解决平台差异。
2021-10-25
- 阿里在经历了“检索时代大规模机器学习时代大规模实时在线学习时代深度学习与智能决策时代”后,在18年就已形成了如下的搜索算法体系:
现在的方向是基于电商认知图谱的在线图计算与推理引擎。有了上述架构,在全域的搜索推荐导购、智能交互和内容生成等领域上,都会产生各种微妙的反应。并且在认知应用过程中,根据用户对认知推理结果的反馈,系统持续迭代的认知图谱以及推理算法,从而提升认知计算能力。 - neo4j匹配最短路径:
match (m:Person {name:'zhangsan'}),(n:Person {name:'李四'}),p=shortestPath((m)-[*]-(n))
where none(r in relationships(p) where type(r)='FATHER') return p
2021-10-26
- 幂等不修改服务器状态的用GET,幂等修改服务器状态的用PUT,不幂等修改服务器状态的用POST
- 静态代理模式中,真实对象和代理对象都需要实现同一个接口,代理对象要代理真实角色。好处是代理对象可以实现真实对象做不了的事情,真实对象可以专注自己的事情
2021-10-27
- 在实际的neo4j项目开发中,查询时不要频繁实例化ExcutionEngine,以便之前的查询可以存到缓存中去。
- 想用neo4j的apoc库时,可以把NEO4J_HOME/plugins目录下,然后重启neo4j
- cypher或者sql每次编译后都会得到一棵语法树,neo4j有两级缓存,分别为string cache和AST cache。cache首先根据语句的string hash判断,所以一样的语句,但是大小写或者空白符不一样对于缓存来说都是不相同的。如果在string hash中没找到缓存,那么会将查询正规化,得到其语法树并进行缓存,AST cache不区分大小写。所以在查询中尽量使用参数,不要使用字面值,可以提高一个执行计划的复用次数。
- 要避免中间的结果集过大,所以要尽早distinct,尽早limit,用collect减少结果的行数,在正确的地方使用order by
- 多个unwind会导致笛卡尔积的产生,在match中也要尽量避免使用多个模式
# 1. 笛卡尔积 80000 ms w/ ~900 players, ~40 teams, ~1200 games
MATCH (pl:Player),(t:Team),(g:Game)
RETURN COUNT(DISTINCT pl),
COUNT(DISTINCT t),
COUNT(DISTINCT g)
# 2. 8ms w/~900 players, ~40 teams, ~1200 games
MATCH (pl:Player)
WITH COUNT(pl) as players
MATCH (t:Team)
WITH COUNT(t) as teams, players
MATCH (g:Game)
RETURN COUNT(g) as games, teams, players
2021-10-28
- 显式地指定索引的方式,就是使用using从句:
match (n:Person) using index n:Person(id) where n.name='zhangsan' return n
或者match (n:Person) using scan n:Person where n.name='zhangsan' return n
- 老项目中查询企业间最短路径时,未绑定关系的跳数上限,路径方向也未指定
- neo4j相关函数:https://www.cnblogs.com/jpfss/p/11464802.html
2021-10-29
- 代码导入数据问题排查发现,测试数据的csv文件编码有问题,修改后重新尝试成功
2021-11-01
- 写图数据库批量导入的定时函数,但是每次删除所有节点后存储空间并不会释放,需要比对纯净版neo4j和导入数据后的neo4j相关文件,确定每次更新数据后是否能直接删除neo4j相关文件来释放硬盘空间
2021-11-02
- 修改报告
- 写按品牌查询、三类节点查询、三类节点和属性同时查询的接口
2021-11-03
- 变量和引用变量存放在栈中,实例化的对象存放在堆中!!!!!
- 下面的代码说明了:
- 字符串对象与null的值不相等,且内存地址也不相等;
- 空字符串对象与null的值不相等,且内存地址也不相等;
- new String()创建一个字符串对象的默认值为"" (String类型成员变量的初始值为null)
判断字符串为空的经典方法是if(str == null || str.length() == 0) { balabala... }
public class String_Demo01 {
public static void main(String[] args) {
String str1 = new String() ;
String str2 = null ;
String str3 = "" ;
System.out.println(str1==str2); //内存地址的比较,返回false
System.out.println(str1.equals(str2)); //值的比较,返回false
System.out.println(str2==str3); //内存地址的比较,返回false
System.out.println(str3.equals(str2)); //值的比较,返回false
System.out.println(str1==str3); //内存地址的比较,返回false
System.out.println(str1.equals(str3)); //值的比较,返回true
}
}
- 写了randomQuery和recommend两个接口
2021-11-04
- IDEA导入新项目的时候得去maven tab里面点一下+,再勾选一下新项目的pom.xml文件
- 和隔壁组的同事请教他关于自动补全的实现方案:完全是按统计的方法进行计算,直接从电商平台的商品完整标题着手,即目前的电商平台有九万多个商品标题,这些标题由3000多个不同的字符组成。这三千多个不同的字符组合成了19万个不同的常用词条(由分词后统计得到),然后通过for循环统计不同词条在不同标题中的多种距离(该距离是由完整的标题分词后在列表中的下标衡量的),最后做一个归一化(我自己猜的)作为两个词条之间的距离。除了距离以外还有出现频次等其他指标,都会分配不同的权重综合考虑。统计算法遍历过所有的商品标题后,会生成一个哈希字典,字典的key是词条,value是补全后的词条。举例来说,{"自":"自行车"}、{"自":"自嗨锅"}、{"自":"自然堂"}、{"自行车":"自行车脚蹬"}、{"自嗨锅":"自嗨锅米饭"}、{"自然堂":"自然堂面膜"}等等都可能是该字典中的键值对。
2021-11-05
- 写代码注释,提交SVN
all(x in nodes(p) where single(y in nodes(p) where y = x))
2021-11-08
- 统计图谱中度在一定范围内的节点:
match (n:Enterprise) with size((n)--()) as degree
where degree <= 3 return n.name,degree order by degree desc limit 3
- 企业图谱中单独查询上三层得到的重复实体总个数为4072,一次性查询上三层和下三层得到的重复实体总个数为36232;目前分析写到一条cypher中时也得拆开写,一段一段地写,不能直接把上三层和下三层放到一条路径中查询
2021-11-09
- 将查询企业节点的cypher合并为一条
2021-11-10
- 把五条查询缩减到三条,结果尼玛优化后的接口比之前的耗时还长,我吐了。。。不过优化的接口里面有去重的操作
- 写了好几次终于比之前的快一秒了(其实没有一秒,只是快一丢丢一丢丢)。。。。我又吐了啊
match p=()-[]->(e:Enterprise {name:{name}})
match q=(f:Enterprise {name:{name}})-[]->()
unwind relationships(p)+relationships(q) as rel with collect(distinct rel) as link return link
2021-11-11
- 用session会话的方式重写查询接口,但是死活拿不出来值
- 谷歌了tabnine网站,里面有相关示例,正在阅读理解中......
2021-11-12
- 今天把节点的相关信息都取出来了,正在封装中......
List session.run("match (m)-[r]->(e:Enterprise {name:$name}) return m",params).list();
list.forEach(record -> {
long id = record.get("m").asNode().id();
StringBuilder type = new StringBuilder();
Iterator types = record.get("m").asNode().labels().iterator();
while(types.hasNext()) {
type = new StringBuilder(types.next());
}
Map = properties_map = new HashMap<>();
Map property_map = record.get("m").asNode().asMap();
Set> entrySet = property_map.entrySet();
for(Map.Entry entry:entrySet) {
properties_map.put(entry.getKey().toString(), entry.getValue());
}
})
2021-11-15
- 修改知识图谱挑战报告
- 有些循环取值的操作实例化变量这行代码还是得放在循环体里,放在外面的话是不会实时更新的,放在外面初始化之后值是不会变的
2021-11-16
- 修改知识图谱基础能力评估报告
- 取出了关系的值,待封装......
2021-11-17
- 优化接口1.0版本完成,数据查询和处理时间均大幅减少
2021-11-18
- 在存储过程中动态构建sql,采用预编译的方式防御sql注入
- 修改完善周一和周二的两个报告
2021-11-19
- 阅读银行数字化白皮书,写产业化应用PPT
2021-11-22
- 反欺诈图谱中应该包含的实体有:IP地址、经纬度、设备指纹、账户、联系人、逾期黑名单等;关系包括: 从属关系、紧急联系人、互通电话、同一网络等等
- 写ppt的银行数字化转型背景
2021-11-23
- 写ppt的数字化转型方向,知识图谱能力,赋能金融部分
2021-11-24
- 修改PPT
2021-11-25
- 导入新的电商数据,数据有问题,处理中。。。
- neo4j中的checkpoint是指将挂起的页面更新从缓存中刷新到存储文件的过程;pruning是指删除那些对于恢复任务来说没有存在必要的事务日志。个人理解只有完成了checkpoint操作,才会进行pruning操作
2021-11-26
- 电商新数据全部导入
- 调研Nebula Graph
2021-11-29
- 修改PPT,设计反欺诈图谱结构
2021-11-30
1.设计风控图谱结构,画图
2.阅读批处理代码
3.做金融知识图谱平台PPT
2021-12-01
- 修改图谱平台PPT
- 设计风控图谱的实体类型及相关属性;关系的类型及相关属性;统计部分实体个数
2021-12-02
- 查询同名同性别的学生,并返回数量:
select s_name,s_sex,count(s_name) from student group by s_name,s_sex having count(s_name)>1;
查询不同课程成绩相同的学生的学生编号、课程编号、学生成绩:select sc1.* from score sc1 ,score sc2 where sc1.s_id=sc2.s_id and sc1.score=sc2.score and sc1.c_id<>sc2.c_id group by sc1.s_id, sc1.c_id;
查询每门课程成绩最好的前两名:select * from score sc1 where (select count(*) from score sc2 where sc1.c_id = sc2.c_id and sc1.score <= sc2.score) <3 order by sc1.c_id , sc1.score desc;
- 写反欺诈项目方案
- 倒入反欺诈图谱的三类节点
2021-12-03
- 导入反欺诈图谱的关系
- 重画PPT
2021-12-06
1.查找反欺诈图谱的相关论文
2.画反欺诈的图
2021-12-07
- 扫码登陆实现原理:
- 访问PC端二维码生成页面,PC端请求服务端获取二维码ID
- 服务端生成相应的二维码ID,设置二维码的过期时间,状态等。
- PC获取二维码ID,生成相应的二维码。
- 手机端扫描二维码,获取二维码ID。
- 手机端将手机端token和二维码ID发送给服务端,确认登录。
- 服务端校验手机端token,根据手机端token和二维码ID生成PC端token
-
PC端通过轮询方式请求服务端,通过二维码ID获取二维码状态,如果已成功,返回PC token,登录成功。
-
查找load csv的远程导入方法;学习neo4j-admin import命令
movie.csv:
movieId:ID,title,year:int,:LABEL
tt0133093,"The Matrix",1999,Movie
tt0234215,"The Matrix Reloaded",2003,Movie;Sequel
tt0242653,"The Matrix Revolutions",2003,Movie;Sequel
actors.csv:
personId:ID,name,:LABEL
keanu,"Keanu Reeves",Actor
laurence,"Laurence Fishburne",Actor
carrieanne,"Carrie-Anne Moss",Actor
roles.csv:
:START_ID,role,:END_ID,:TYPE
keanu,"Neo",tt0133093,ACTED_IN
keanu,"Neo",tt0234215,ACTED_IN
keanu,"Neo",tt0242653,ACTED_IN
laurence,"Morpheus",tt0133093,ACTED_IN
laurence,"Morpheus",tt0234215,ACTED_IN
laurence,"Morpheus",tt0242653,ACTED_IN
carrieanne,"Trinity",tt0133093,ACTED_IN
carrieanne,"Trinity",tt0234215,ACTED_IN
carrieanne,"Trinity",tt0242653,ACTED_IN
bin/neo4j-admin import --database=neo4j --nodes=import/movies.csv --nodes=import/actors.csv --relationships=import/roles.csv
相关资料博客:https://cloud.tencent.com/developer/article/1694378?from=article.detail.1387710
2021-12-08
写自动读取csv各类文件数量的工具类
File file = new File(this.getClass().getRecourse("/").getFile());
2021-12-09
- 编写清空并重新导入电商图谱的定时函数
- linux下启动tomcat报错,使用文件/目录权限设置命令chmod修改后即可,如下:
- 先进入tomcat的bin目录下:比如tomcat是apache-tomcat-6.0.48,则先进入cd apache-tomcat-6.0.48/bin
- 然后用命令chmod 修改一下bin目录下的.sh权限就可以了
chmod u+x *.sh
u 这里指文件所有者
+x 添加可执行权限
*.sh表示所有的.sh结尾的文件
2021-12-10
- tomcat下的bin/catalina.sh里面的JAVA_OPT这一项可以添加一些对jvm的配置监控之类的操作
-
firewall-cmd --zone=public --add-port=3690/tcp --permanent
,提示FirewallD is not running错误,则说明防火墙未开启;
systemctl status firewalld
,查看firewalld状态,发现当前是Active: inactive (dead)状态,即防火墙未开启;
systemctl start firewalld
,开启防火墙,没有任何提示即开启成功;
systemctl status firewalld
,查看firewalld状态,显示running即已开启了;
systemctl stop firewalld
,这条指令来关闭该功能;
先查看防火墙开放端口列表对于Centos7系统firewall-cmd --zone=public --list-ports
firewall-cmd --zone=public --add-port=8080/tcp --permanent
重新加载防火墙firewall-cmd --reload
-
如何访问存在服务器的图片或者视屏等静态资源:
在tomcat /conf/server.xml 添加
- 重新构造推荐接口用于前端展示的查询cypher
2021-12-13
- 编写推荐接口用于前端展示的recommendForShow接口
- 测试代码远程导入的可行性,结果可行
2021-12-14
- 导入部分反欺诈数据到neo4j,导入风控转账记录时出现了缺失数据的情况
using periodic commit 10000 load csv with headers from 'file:///xxx.csv as line match (m:Label {labelId:line.fromId}) match (n:Label {labelId:line.toId}) merge (m)-[r:INCLUDE]->(n) on create set r.amount = line.amount'
这种插入方式是会更新覆盖同一条关系信息的......所以如果要往两个节点之间插入多条同一类型的关系时,直接create (m)-[r:INCLUDE {amount:line.amount}]->(n)
就行sad
2021-12-15
- 编写导入交易流水的接口函数,正在导入中,预计今天晚上可以导入完成......
2021-12-16
- 按照新的推荐规则编写cypher,练习动态规划算法
2021-12-17
- 编写同品类规则的推荐接口,经验是要匹配路径的时候要一个label一个label地去匹配,千万别直接一股脑的在一条路径上匹配:
match (o:Essence)-[:ESSENCE_OF]->(n:ForthGrade) where n.goodsId = $goodsId with o as essence
optional match (m:ThirdGrade)-[:COTAIN]->(essence) with m as third
optional match p=(third)-[c:CONTAIN]->(essence)-[e:ESSENCE_OF]->(goods:ForthGrade)<-[a:AGENT]-(brand:Brand) where goods.goodsId <> $goodsId
return third.cateName as cate_name, third.cateId as cate_id, id(c) as contain_edge,
essence.essenceName as essence_name, essence.essenceId as essence_id, id(e) as essence_edge,
brand.brandName as brand_name, brand.brandId as brand_id, id(a) as agent_edge,
goods.goodsName as goods_name, goods.goodsId as goods_id order by goods.saleVolume limit 8
2021-12-20
- 推荐接口中新增了直接匹配三级节点的查询规则,修改了返回数据的内容格式
- 查找可信执行环境的相关资料
2021-12-21
- 撰写TEE报告中的发展历史与实现形态部分
- 将标注完成的本质节点导入neo4j,修改了接口中的cypher(原接口的cypher查询得到的是同一三级节点下不同3.5级节点下的商品,然后删除了第二行以后就能查到同一三级节点下同一3.5级节点下的商品了,醉了......合着中间匹配一次别的label节点上一次匹配到的label节点就作废了
)
2021-12-22
- 修改推荐展示接口的bug
- 完成TEE报告中的实现形态部分
2021-12-23
- 了解区块链预言机,查找整理现有预言机种类相关资料,完成报告相应部分
- 导入最新的电商数据到neo4j集群
2021-12-24
- 修改推荐接口中三级节点和三点五级节点同名导致的节点列表数据不全的问题
- 添加代码注释
- volatile修饰的成员变量在每次被线程访问时,都强迫从共享内存中重新读取该变量的值。而且当该成员变量的值发生变化时,会强迫线程将变化后的值回写到共享内存中去。
2021-12-27
-
阅读大数据实时处理框架方案:其中数据采集端使用flume,缓冲缓存用Kafka,实时计算用Spark,存储用ES。腾讯的图数据库应用实践中自研了EasyGraph+Angel-Graph.
- 传统的MapReduce任务假设数据之间的联系较弱,使得数据的划分和并行计算较为容易。但是对图而言,数据之间的耦合性较强,往往需要先对图进行划分,不同的划分方式对计算效率影响较大。MapReduce的粗粒度划分会导致负载计算不均衡等问题,最终导致图的计算效率较低,所以2010年Google提出Pregel分布式图计算框架,并提出了以顶点为中心的编程思想:Think like a vertex 像顶点一样思考,每个点都可以接收邻居发送的信息,并结合自身的属性和更新函数进行更新操作,并把更新后的信息沿着邻边发送给邻居,通过不断迭代完成整个计算过程。在做计算时站在顶点的角度思考整个图计算过程,可以灵活表达多种图算法,提升开发效率。
2021-12-28
- 把推荐接口中的所有节点和关系全部进行了去重操作
- Chainlink开发准备:
- 安装Go1.17,并将go路径添加到环境变量中
- 安装Nodejs和yarn
- 安装Postgres (>= 11.x),连接方式配置为SSL
- 确认已安装了Python 3,因为要编译Solidity合约
- 下载Chainlink:
git clone https://github.com/smartcontractkit/chainlink && cd chainlink
- 构建并安装Chainlink:
make install
(编译安装的时候如果碰到yarn包的报错,就yarn install
一下) - ......
2021-12-29
- 在移植老项目到新项目过程中遇到了
nested exception is org.springframework.data.mapping.MappingException:Couldn't find PersistentEntity for type class jva.lang.Object!
是因为继承Neo4jRepository的时候没有完成图谱中实体的映射过程
2021-12-30
1.完成了Neo4jRepository的Enterprise实体映射过程,但是老项目的neo4j是3.5版本的,不支持多库,而新项目是4.3版本的,目前能想到的解决办法是把老项目的企业图谱迁移到4.3的neo4j集群上,放到默认的neo4j库里面,然后把原来neo4j库里面的电商图谱拿出来,再建一个电商库放进去
2021-12-31
- 重写接口返回内容的实现方式
2022-01-04
1.以枚举类的方式实现前端数据的返回
2.初步验证了SDN6.0版本能够以继承Neo4jRepository的方式进行查询增删改查(一些注解进行了细微的改动)
- 调研图表示学习的相关算法和工业案例
2022-01-05
1.数禾科技在进行金融图谱反欺诈的业务探索时,观察建模样本,发现在该关联关系网络中,出现金融领域比较常见的一个情况:有特征的节点过于稀疏。在此情况下建模,会使得模型在训练过程中难以收敛。于是对单个没有特征的节点做了剪枝。考虑到关系数据本身的稀疏性问题以及图结构的特殊性,采用过采样和欠采样的方式,会导致图结构发生改变。因此,采取相对简单暴力的在loss上添加weight的方式使模型可以正常学习收敛。模型采用GraphSage+GAT的模式构成主要的模型结构。大概分为以下几步:
- 通过GraphSage的方式对目标节点进行多层邻居采样,得到子图;
- 在采样的子图上使用GAT网络作为聚合方法,对邻居节点进行多层聚合;
- 最终得到目标节点embedding后送入FNN网络,输出最终结果。
- 学习使用DGL工具库中的GCN训练图结构数据
2022-01-06
- 将行内微服务依赖关系数据导入到neo4j集群
- 调整项目代码结构
- 在自己的Acaconda环境下安装PyTorch报错说清华源和现在的源有冲突,我特么
conda config --show urls
就没看见有清华的源,我吐了......
2022-01-07
- 面向Windows的cuda,cudnn和Pytorch的完整安装教程:https://blog.csdn.net/qianbin3200896/article/details/104244538
- conda新建环境以后不能直接使用,需要激活,全流程步骤如下:
- 先新建环境:
conda create -n dgl python=3.6.5
-
然后激活更新base环境(红框里的语句),再切换到新建的dgl环境下
- python文件起名的时候不要起跟包名或者包下文件名重复的名字,不然会报找不到包的错误
- 学习DGL官方文档,下一步准备构建相应的训练数据
2022-01-10
- 下载neo4j社区版的四个不同版本
- 设置dgl训练模式为GPU
2022-01-11
- 调试dgl样例代码
- 写试用期总结
2022-01-12
- 画知识图谱加深度学习应用的PPT
2022-01-13
- 编写只返回推荐商品id和名称的recommendSameEssence接口
- 模拟训练集,跑节点分类模型
2022-01-14
- top命令参数含义:https://www.cnblogs.com/Zender/p/7048569.html
- 随机模拟的节点特征训练效果很差
2022-01-17
- 创建临时变量遍历查询:
match p=(m:Account {accountId:'xxxxxxxxx'})-[:HISTORICAL_TRANSFER]->(n:Account) set m.totalTransAmt = 0
foreach (link in relationships(p) | set m.totalTransAmt = m.totalTransAmt + link.transAmt) with m,m.totalTransAmt as amount
remove m.totalTransAmt return amount
- 查找时序图计算的资料
2022-01-18
- 看TGN,没咋看懂
2022-01-19
- neo4j集群中不能运行GDS库,因为GDS库使用单台机器上的主内存来托管图形目录中的图形和各种算法。GDS工作负载会在运行时消耗机器的大部分系统资源,可能会使机器长时间无响应,进而导致数据损坏或者集群中断
- 学习GDS创建图,图中关系,运行节点相似度算法的相关demo.
2022-01-20
1.翻阅GDS文档,理解相关图机器学习算法的调用流程
2022-01-21
- 开会讨论neo4j社区版集群搭建,主要需要解决的问题是路由;反欺诈进展,先取一个时间切片做小范围训练实验
2022-01-24
- 在neo4j中安装neosemantics插件时,不仅要在neo4j.conf配置文件中加一条
dbms.unmanaged_extension_classes=n10s.endpoint=/rdf
,还应该在dbms.security.procedures.unrestricted
和dbms.security.procedures.allowlist
这两个配置项后面都加上n10s.*,反正我没加之间都用不了这个插件...
2.很神奇的一段cypher:
MATCH (c:`ns0__角色`)-[]->(:`ns0__角色`) WITH c, count(*) AS num
RETURN min(num) AS min, max(num) AS max, avg(num) AS avg_characters, stdev(num) AS stdev
查询结果如下,共有221位角色出现在了知识图谱中。每个角色平均解决近3名角色,最多达到了26名,最少仅为1名,标准差为3.79。
3.验证六度理论:
MATCH (a:`ns0__角色`), (b:`ns0__角色`) WHERE id(a) > id(b)
MATCH p=shortestPath((a)-[*]-(b))
RETURN length(p) AS len, [x IN nodes(p) | split(x.uri, 'http://kg.course/marvel')[-1]] AS path
ORDER BY len DESC LIMIT 4
4.查找关键节点:
MATCH (a:`ns0__角色`), (b:`ns0__角色`) WHERE id(a) > id(b)
MATCH p=allShortestPaths((a)-[*]-(b)) WITH collect(p) AS paths, a, b
MATCH (c:`ns0__角色`) WHERE all(x IN paths WHERE c IN nodes(x)) AND NOT c IN [a,b]
RETURN a.uri, b.uri, c.uri AS PivotalNode SKIP 490 LIMIT 10
2022-01-25
- 找合适的图谱数据集,发现数据集都得二次处理.......找到了一个企业投资关系图......
2022-01-26
1.处理数据集
2022-01-27
1.处理完数据集,用了下gds的算法,效果垃圾的一笔,不过是应该数据的问题
2022-01-28
- 配置了git的ssh key;导了WN18RR的数据集,运行gds的社区检测算法效果还是垃圾的一笔.......
2022-02-07
- 设计账户特征:截止到某一天可提取1、3、7、10、15.......天内的转账记录(转入笔数、转入总额、转入最大金额,转出笔数,转入金额,转出最大金额)
- 查询风险账户,不重复的有94384个
2022-02-08
- 编写接口将风险账户导出至txt文件
- 查看hades文档
2022-02-09
1.找了twitter的数据集,处理数据中......
2022-02-10
- 将处理后的twitter数据集使用neo4j-admin方式导入4.3.3社区版的neo4j中,测试用时为82.4s,相较于3.5企业版本仍快了111s
2022-02-11
- 进行了4.3版本的值查询、简单条件遍历查询和部分复杂条件遍历查询的相关测试
2022-02-14
- 完成了复杂条件遍历查询的测试;
- 编写并发测试的方法
2022-02-15
- 完成并发测试(下面是计算并发执行时间的方法)
public long timeCalculator(Executor executor, int concurrency, final Runnable task) throws InterruptedException {
final CountDownLatch allReady = new CountDownLatch(concurrency);
final CountDownLatch start = new CountDownLatch(1);
final CountDownLatch allOver = new CountDownLatch(concurrency);
for (int i = 0; i < concurrency; i++) {
executor.execute(new Runnable() {
@Override
public void run() {
allReady.countDown();
try{
start.await();
task.run();
} catch (InterruptedException e) {
e.printStackTrace();
} finally {
allOver.countDown();
}
}
});
}
allReady.await();
long startTime = System.nanoTime();
start.countDown();
allOver.await();
long endTime = System.nanoTime();
return endTime - startTime;
}
- 调研美团知识图谱平台架构的细节
2022-02-16
- 撰写GDS介绍文档
- 撰写美团图数据库平台架构技术文档
2022-02-17
- 写XR创新点的ppt
- 重新测试4.3版本相关指标
2022-02-18
1.JAVA计算多线程的执行总时间:
ExecutorService exec = Executors.newCachedThreadPool();
long start = System.nanoTime();
System.out.println("kaishi");
for (int i = 0; i < 3; i++){
exec.execute(new SlsPredictor(args) );
}
exec.shutdown();
exec.awaitTermination(1, TimeUnit.HOURS); // 或者更长时间(这行代码是关键)
long time = System.nanoTime() - start;
该函数所在线程会陷入阻塞,直到shutdown请求发出导致所有线程都结束、或者时间超时、或者当前线程被中断,这三个条件只要发生一个,线程就会跳出阻塞状态。
2022-02-21
1.找bug,发现当单线程内的查询次数为1000时,10并发数下的TPS能达到1587
- 接触了下星云图数据库
2022-02-22
- 学习java多线程上下文切换相关知识
- 安装openue中......
2022-02-23
- 调试openue训练代码
2022-02-24
- 制作数据湖的创新ppt
- 阅读openue的教程代码
2022-02-25
- Hugging face是美国纽约的聊天机器人公司,他最牛逼的地方在于拥有大型的NLP技术开源社区,他有一个预训练语言模型库Transformers。直到2019年7月16日,在repo上已经有了包括BERT,GPT,GPT-2,Transformer-XL,XLNET,XLM在内六个预训练语言模型
2022-02-28
- 下载neo4j 4.3.10企业版和社区版
- 单调读一致性需要保证客户端不会读到旧值;单调写一致性保证了客户端的写操作是串行的;读写一致性保证了客户端能够读到自己最新写入的值;写读一致性保证了客户端对一个数据项的写操作是基于该客户端最新读取的值
2022-03-01
- linux更新清华源的时候报连不上的错误,把源里面的https改成http就行,之前好像是因为国外制裁过一次......
修改/etc/apt/sources.list为以下内容:
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# deb-src http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-proposed main restricted universe multiverse
建立 ~/.condarc 文件,然后在其中加入:
channels:
- defaults
show_channel_urls: true
default_channels:
- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free
- http://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/r
custom_channels:
conda-forge: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
msys2: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
bioconda: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
menpo: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
pytorch: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
simpleitk: http://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud
在 ~/ 下建立 .pip文件夹,cd .pip/ 后,建立 pip.conf文件,并在其中写入:
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
- 在unbutu上安装Anaconda
2022-03-02
- U盘安装ubuntu教程
[ubuntu安装nvidia显卡驱动] (https://blog.csdn.net/weixin_44123583/article/details/115613758) - 企业图谱的数据目前想到的是通过浏览器用分页的方式导出csv文件
2022-03-03
- 多线程由于可以共享堆内存,因此可以简单地采用内存作为标记存储位置。而进程之间甚至都不在同一台服务器上,因此需要将标记存储在一个所有进程都能看到的地方
分布式锁的资料 - 将企业图谱的所有节点信息导出至了csv文件中
2022-03-04
配置ubuntu 20.4桥接模式
ubuntu关闭防火墙命令:ufw disable
筹划绘制neo4j社区版集群技术方案
2022-03-07
- 在ubuntu上安装deepke项目及环境,训练了全监督的关系抽取模型,但是预测效果目前看来不咋地
2022-03-08
- deepke的ner模型用cpu训练巨慢,根本不行;re模型预测效果巨差
批量插入字符快捷键:命令行模式下,输入 " : 首行号,尾行号 s /^/字符/g "实现批量插入字符。如 输入:2,7s/^/#/g
,在2到7行首插入#,即注释功能
批量删除字符快捷键:命令行模式下,输入 " : 首行号,尾行号 s /^字符//g "实现批量删除字符。如输入:2,7s/^#//g
,即解开注释 - 熟悉apoc导出文件的命令:
- 先去conf文件夹下面新建一个apoc.conf文件,然后往里面写
apoc.export.file.enabled=true
,如果想导出文件到指定路径(默认是导出到import文件夹下面),就得再写apoc.import.file.use_neo4j_config=false
,再去把neo4j.conf里面的dbms.directories.import
改成你自己想要导出的目录路径。上面的都改完了得重启neo4j服务才能生效啊!
MATCH (person:Person)-[actedIn:ACTED_IN]->(movie:Movie)
WITH collect(DISTINCT person) AS people, collect(DISTINCT movie) AS movies, collect(actedIn) AS actedInRels
CALL apoc.export.csv.data(people + movies, actedInRels, "movies-actedIn.csv", {})
YIELD file, source, format, nodes, relationships, properties, time, rows, batchSize, batches, done, data
RETURN file, source, format, nodes, relationships, properties, time, rows, batchSize, batches, done, data
运行完你就会发现import目录下面多出来了 movies-actedIn.csv 文件,具体你想要节点或者边也可以自己搭配着写上面的cypher。
2022-03-09
- neo4j的因果集群:在执行一条事务时,客户端会向此次交易的服务器征询一个bookmark标记作为参数传给下一条事务,即该客户端接下来的事务仍然会请求上次交易的服务器。集群通过bookmark保证了客户端的事务不会在不同服务器上瞎执行,进而避免因果不一致的现象发生。
- neo4j转储操作
$neo4j-home> bin/neo4j-admin dump --database=graph.db --to=/backups/graph.db/2016-10-02.dump
转储恢复操作:$neo4j-home> bin/neo4j-admin load --from=/backups/graph.db/2016-10-02.dump --database=graph.db --force
- 用apoc将person节点和group关系导了出来
2022-03-10
-
neo4j-admin unbind
通过移除cluster state属性从而将集群中的成员服务器解散 - apoc一次性导出的文件太大了,直接插neo4j会崩,正在切分文件......
2022-03-11
- 完成了企业图谱的全图迁移以及与交易图谱的图谱整合(Tips:neo4j的index允许字段的值重复,创建方式为
create index on :Person(personId)
,但是constraint不允许)
2022-03-14
- selinux由美国国安局开发,主要作用是最大限度地减少系统中服务进程可访问的资源
- 如果配虚拟机的桥接模式的话,如果ping不通就先查查主机的ipv4是不是变了(变了的话就重新再手动更新一下,参考上面的虚拟机配置桥接模式)
- linux无法ping通百度解决办法(参考)
- linux的/etc/hosts文件通常是用来做常用域名与ip地址的映射,从而实现快速访问,实现映射的格式为
ip地址 域名
firewall-cmd --list-all
2022-03-15
- ssh: connect to host 192.168.57.1 port 22: Connection refused解决方案:
ufw allow 22
systemctl restart sshd
- ubuntu如果因为依赖冲突安装不了openssh-server,更新一下apt-get就行了
apt-get update
- ssh 本地免密登陆:
ssh-keygen
一路回车cd ~/.ssh
cat id_rsa.pub >> authorized_keys
ssh localhost
不用密码直接能登陆就表示设置成功了 - SSH服务器拒绝了密码,请再试一次的解决方案:
vim /etc/ssh/sshd_config
解开PermitRootLogin和StrictModes配置项 将PermitRootLogin的prohibit-password改为yes:wq
保存退出passwd
重置一下linux密码(这一步看情况使用)systemctl restart sshd
重启一下ssh服务,再去ssh-copi-id /root/.ssh/id_rsa.pub 192.168.69.45
进行ssh互信 - linux查找并删除所有文件名中带有特定关键词的文件:
find . -name "*crontab.*" | xargs rm -rf
- linux时钟同步详细教程:同步时间,可以使用ntpdate命令,也可以使用ntpd服务。前者安装命令为
apt-get install ntpdate
,后者安装命令为apt-get install ntp
,值得注意的是ntp和ntpdate不能同时使用,即当ntp服务开启的时候无法进行ntpdate手动同步。ntp服务开启方法为/etc/init.d/ntp start
关闭方法为/etc/init.d/ntp stop
当然也可以用service ntp start/stop
或systemctl start/stop ntp
来开启和关闭,因为ntp本身就是个service。具体操作可参考教程内容(教程里面叫ntpd,应该是针对centOS的,在ubuntu中叫ntp,少一个字母的差别,其他文件位置和相关命令用法没区别)。cn.pool.ntp.org是中国公共NTP服务器。 - 列出系统的现有服务:
systemctl list-unit-files --type=service
或者service --status-all
2022-03-16
- cron定时任务相关流程:如果没有cron就先安装
apt-get install cron
crontab -e
进入编辑cron表达式和相关定时任务(注意编写任务的时候不管是服务还是文件,都要用绝对路径!!!),编辑完毕按照下面的提示操作保存退出即可service cron restart
(我这么做是懒得去检查cron服务的状态了,管你激活没激活,重启就完事儿了)启动之后你可能会发现任务没有执行,这时你可以先简单的用service cron status
去看看cron运行情况:如果想看完整日志的话,vim /etc/rsyslog.d/50-default.config
,进去把cron.log
前面的注释解掉,重启rsyslog:systemctl restart rsyslog
,然后就能去/var/log/cron.log
里面看了
- 如果你在运行日志里面看见了No MTA installed, discarding output,就说明你没有安装MTA(Mail Transfer Agent,邮件传送代理服务),那么直接安装一个postfix即可:
apt-get install postfix
,安装过程一路回车就行systemctl restart postfix
启动postfix以后,可以去/var/mail/root(这个不一定是root,但是一定是你当前环境的用户名)
下面看看邮件内容 - 如果又发现了xxx not found,那就做个软链接或者导入环境变量(我觉得这个导入环境变量好像有点做软链接的味道,感觉而已,也许是错的,whatever~)
2022-03-17
- neo4j 4.3.x删除数据库方法:
分别把/data/databases和/data/transactions下面的neo4j文件夹删掉再重建
然后重启一下服务就行了 - 用session方式往neo4j 4.3.10社区版里面导节点信息的时候,每个csv文件50万条记录,每条记录里面13个属性,导到第12个文件的时候报错:Fatel error occurred in the pipeline: Could not apply transaction to the store after written to log,企业版当初也报错了,但是不是这个错,忘了具体内容是啥了........google的时候有一条issuse下面好像是官方人员回复的,说是在4.x版本的neo4j中,节点、关系、路径实例都会和事务绑定到一起,报错里面说的是日志写完以后没法儿把事务存起来了,然后
df -h
看了下服务器的硬盘,确实没内存了.....然后就换了台服务器安装社区版neo4j,再导就没啥问题了(应该,因为18号的时候直接把那些文件拷贝进去了) - 制作事理图谱的ppt
2022-03-18
- 两台服务器之间传输文件命令:
- 对拷文件夹(包括文件夹本身):
scp -r /home/neo4j/neo4j-community-4.3.10/ [email protected]:/home/neo4j
- 对拷文件夹下所有文件(不包含文件夹本身):
scp /home/neo4j/neo4j-community-4.3.10/* [email protected]:/home/neo4j/neo4j-community-4.3.10/
- 把212上企业版的图库文件(即/data/databases/neo4j和/data/transactions/neo4j下面的那堆数据结构和transaction文件)采用scp方式传输到了209社区版的neo4j中,然后209重启了服务发现还真的能用!!!66666
2022-03-21
- DRBD(Distributed Replicated Block Device)分布式备份块设备的primary角色拥有读写权限,但是secondary角色什么权限都无,因为它负责保证缓存的一致性
- 查找ubuntu安装drbd方法,都过时了........
2022-03-22
- 装了两个centos系统
2022-03-23
- 测试验证deepke关系抽取模型的相关效果
- 调研百度的DuIE关系抽取模型,下一步拟将DuIE在本地跑通,然后构建图谱
2022-03-24
- 调研百度的DuEE事件抽取模型,分析数据集,可以把duee_fin数据集用deepke的re训练一下,但是感觉效果会很辣鸡,因为duee是篇章级别的
2022-03-25
- 做事理图谱的ppt
2022-03-28
- 词性标注说明:
n:普通名词 nt:时间名词 nd:方位名词 nl:处所名词 nh:人名 nhf:姓 nhs:名 ns:地名 nn:族名 ni:机构名 nz:其他专名 v:动词 vd:趋向动词 vl:联系动词 vu:能愿动词 a:形容词 f:区别词 m:数词 q:量词 d:副词 r:代词 p:介词 c:连词 u:助词 e:叹词 o:拟声词 i:习用语 j:缩略语 h:前接成分 k:后接成分 g:语素字 x:非语素字 w:标点符号 ws:非汉字字符串 wu:其他未知的符号
- 命名实体说明:
B-PER、I-PER:人名 B-LOC、I-LOC:地名 B-ORG、I-ORG:机构名
- OpenNER的训练集也是英文的,ChineseNLP是滴滴的项目,整理了中文自然语言处理相关任务、数据集及当前最佳结果
- 安装了PaddleNLP
- 在centos上安装drbd
2022-03-29
- 在Linux的Tikanga版本中,hostname是Linux的内核参数,保存在
/proc/sys/kernel/hostname
中,但它的值是Linux启动时由rc.sysinit从/etc/sysconfig/network
中加载到内核中的;在CentOS7中,只需要在/etc/hosts
里面添加本机ip和新的主机名称,后面他会自动更新hostname值(重连一下就好) - VMWare添加新磁盘:
fdisk /dev/sdb
n
p
一路回车w
mkfs.ext4 /dev/sdb1
- 安装drbd(CSDN版本)(Google版本)的时候上面两个博客可以搭配着看,总的来说Google版本更清晰完整。另外在配置资源文件时要注意主机名要与xx.res文件中on后面的域名相同,即
另外/dev/sdb1
分区应该是一块未使用的分区,用dd if=/dev/zero of=/dev/sdb1 bs=2024k count=1024
(这个操作和后面的对/dev/drbd0格式化都应该在两台服务器上完成的)创建一个大小为2G的未使用的虚拟块设备,其中/dev/zero
代表一个永远输出为0的设备文件,使用它作为输入可以得到全为空的文件,因此可以用来创建新文件或以覆盖的方式消除旧文件,例如dd if=/dev/zero of=file count=10 bs=1024
将从zero设备中创建一个10K大小但内容全为0的文件
2022-03-30
- umount删除挂载点报错正忙的解决办法:
fuser -mv /opt/drbd
,找到对应id后直接kill -9 id
杀死,然后再删除挂载点 - 装好了drbd,但是这玩意儿到底咋用啊
2022-03-31
- 写了一个简单的知识图谱查询接口
- drbd的从节点是不提供服务的
2022-04-01
- linux系统提示只读文件系统,无法创建文件(read-only file system) 解决办法:其实就是查看有没有ro挂载的分区,如果有就重新挂载
- 重装虚拟机安好了drbd,两台服务器能正常使用,下一步测试其中一台宕机怎么办
2022-04-02
- 修改事件图谱PPT
2022-04-06
- 安装并配置keepalived
- CentOS7.9删除自带jdk命令:
rpm -e --nodeps java-1.8.0-openjdk-1.8.0.262.b10-1.el7.x86_64
rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.262.b10-1.el7.x86_64
rpm -e --nodeps java-1.7.0-openjdk-headless-1.7.0.261-2.6.22.2.el7_8.x86_64
rpm -e --nodeps java-1.7.0-openjdk-1.7.0.261-2.6.22.2.el7_8.x86_64
2022-04-07
- drbd各种状态说明及部分故障处理方法
- drbd网络断开后各节点处于cs:StandAlone ro:Primary/Unknown ds:UpToDate/DUnknown状态解决办法:首先
umount /opt/drbd
把两台服务器的挂载点都取消掉然后drbdadm secondary neo4j
把两台服务器的状态都降为从机在任意一台服务器上drbdadm disconnect neo4j
把连接断开(过程会报错,没关系,执行了就行可以)紧接着在同一台服务器上执行drbdadm connect --discard-my-data neo4j
丢弃磁盘上的数据进行重新同步在另一台服务器上进行连接drbdadm connect neo4j
执行完上述过程以后两台服务器应该都是Connected状态了 - keepalived 报错WARNING - default user ‘keepalived_script‘ for script execution does not exist解决方法:在配置文件中添加运行健康检查脚本的用户或者组:
global_defs {
#添加以下参数即可
script_user root
enable_script_security
}
- WARNING - script '/data/scripts/check_neo4j.sh' is not executable for uid:gid 0:0 - disabling是因为权限不够:
chmod 755 /data/scripts/check_neo4j.sh
- 阅读梳理博客中的脚本逻辑
2022-04-08
- 学习keepalived相关配置
2022-04-11
- 计划在脚本中通过ssh的方式控制从机启动neo4j,但是报错如下:
which: no java in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin)
解决方法如下:
在.bashrc文件中添加JAVA_HOME:
export JAVA_HOME=/usr/local/jdk-11.0.14
export PATH=$JAVA_HOME/bin:$PATH
然后source ~/.bahsrc
原因是ssh在远程登陆的时候会加载你远程的那台机器的.bashrc文件,不会加载profile环境变量文件,然后普通的那种使用账号密码登录的会加载profile环境变量文件
2022-04-12
- 研究本地聚类系数的社区检测算法
2022-04-13
- 运行GDS的社区检测算法,编写cypher返回成员最多的社区(没写出来......感觉只能写函数)
2022-04-14
- 编写查询两个正序数组的中位数的方法
2022-04-15
- 在行里的企业流水图谱中测试查询性能,其中查询两个企业之间所有路径要耗时9.8s
2022-04-18
- 3.5企业版查询两节点所有路径耗时4.3s,4.3社区版耗时3.3s
- 查找知识图谱相关专利进行学习
- 查找编译安装drbd相关博客
- java源代码(编译为)字节码class文件(加载到JVM中)可执行文件机器码
2022-04-19
- 撰写drbd集群搭建手册
2022-04-20
- drbd集群的备机不能对同步磁盘进行挂载,因为drbd对备机的同步磁盘设置了写保护,换言之主机的磁盘在提供服务的时候,备机的磁盘就不能挂载使用
- 思考人物三种关联方式查询企业接口的查询逻辑
2022-04-21
- 编写查询接口中......
2022-04-22
- 接口写完了
- 图卷积网络相关分类内容
2022-04-24
- 写专利的背景、问题和发明内容章节
2022-04-25
- 查询接口要按照算法id查询,但是在代码里用算法id查不到......
2022-04-26
- 浏览器传参的时候尤其是加密字段,前后端解析规则可能不一致
2022-04-27
- 用迭代器迭代封装的方法完成了查询接口的升级版(只进行一次cypher查询)
2022-04-28
- 编写老项目graph下两个controller的测试类
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.http.MediaType;
import org.springframework.test.context.junit4.SpringRunner;
import org.springframework.test.web.servlet.MockMvc;
import org.springframework.test.web.servlet.MvcResult;
import org.springframework.test.web.servlet.result.MockMvcResultMatchers;
import org.springframework.test.web.servlet.setup.MockMvcBuilders;
import org.springframework.web.context.WebApplicationContext;
import static org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get;
@RunWith(SpringRunner.class)
@SpringBootTest
public class GroupQueryControllerTest {
private MockMvc mockMvc;
@Autowired
WebApplicationContext webApplicationContext;
@Before
public vlid setUp() throws Exception {
mockMvc = MockMvcBuilders.webAppContextSetup(webApplicationContext).build();
}
@Test
public void accountApply() throws Exception {
PreparedParams preparedParams = new PreparedParams();
MvcResult mvcResult = mockMvc.perform(post("/account/apply")
.content(JSON.toJSONObject(preparedParams))
.contentType(MediaType.APPLICATION_JSON)
.accept(MediaType.APPLICATION_JSON)
.andExcept(MockMvcResultMatchers.status().isOk())
.andReturn();
}
}
2022-04-29
- yum只下载rpm包不安装(用于在内网环境下搭建环境)
yum install --downloadonly --downloaddir=/opt/self_dependency httpd
该命令会将关于httpd本身及其相关依赖的rpm包都下载到/opt/self_dependency目录。但要注意的是,如果所在系统中已经有了上述依赖包,则会提示Package filename already installed and lasted version,所以如果想在内网生产环境部署,最好在外网一个干净且最小化安装的系统上把需要的所有rpm包下好(这里着重指的是相关依赖的rpm)
yum install -y yum-utils
yumdownloader --reslove --downloadonly --destdir=/opt/self_dependency httpd
rpm -ivh filename.rpm
2022-05-05
- 编写人物之间的闭环查询cypher
2022-05-06
- 编写人物之间的闭环查询接口
2022-05-07
- 完成闭环查询接口50%
2022-05-09
- 闭环查询接口完成100%
- 区块链白皮书最后审核
2022-05-10
- 异步编程的实现方案中,Promise和Reactive的反应式编程本质上还是回调,只是框架的存在一定程度上降低了开发者的心智负担;async/await通过编译器的CPS变换把普通函数变成CPS函数,把Continuation也作为了一个调用参数,函数不仅能从头运行,还能根据Continuation的指示继续从某个点(例如调用IO的地方)运行。此时函数已不仅仅是一个函数了,他还是一个状态机,每次调用它或者是它调用其他异步函数时,状态机都会做计算和状态轮换,换言之Continuation就是对象它自己本身;Golang代表的用户状态线程完全放弃了操作系统提供的线程机制,重新实现了一套线程机制,一切调度工作均由RunTime接管。
- 查看代码逻辑梳理企业关系含义的文档
- 查找论文的智能推荐章节的相关素材
2022-05-11
- 看一篇基于稀疏特征分解的KG推荐论文,这篇论文的核心思想就是要用信息增益的概念来衡量不同特征与用户偏好的相关性
2022-05-12
- CentOS升级内核方法
- 查找融合知识图谱的金融产品推荐资料
2022-05-13
- 构思智能推荐章节的内容
2022-05-16
- 撰写智能推荐章节的内容
2022-05-17
- paddlenlp的Taskflow用法
2022-05-18
- 查找金融关系抽取的数据集,微调训练报销单的实体抽取
2022-05-19
- 撰写论文的智能风控部分
- 构建金融研报领域的schema
2022-05-20
- 完成论文的智能风控部分
- 调研了RocketQA智能问答的安装步骤
- 构思利用UIE做智能问答的可行性
2022-05-23
- 梳理知识图谱信息抽取项目方案书
- 处理生成训练数据
2022-05-24
- 绘制专利流程图
- 编写预处理代码,标注数据
2022-05-25
- 搭建doccano标注工具(Ubuntu版本)(Windows安装)(我草你妈我真服了啊!我就想从windows访问linux虚拟机上的doccano服务,为什么Unbutu的
ufw allow 8000
设置不起作用啊,老子调了一天都快放弃了!最后用firewall-cmd --zone=public --add-port=8000 --permanent
+service firewalld restart
把端口开放成功了,我真是吐了。然后去查了下iptables、firewall、ufw三者的区别,一篇博客里面说iptables是最古老,最底层的防火墙,一般而言让它开启着就行,不用去管它;而ufw和firewall都是较新linux系统上的替代iptables的工具,。因为在实践过程中通过ufw开放了8000端口,但是用firewall-cmd --zone=public --query-port=8000/tcp
查看输出是no,此时windows就访问不到虚拟机的8000端口,这就说明即使ufw开放了8000,但是没跟firewall说,系统就不会开放8000,所以说firewall还是爹啊.)
2022-05-26
- 写知识图谱关系抽取项目demo
2022-05-27
- 构思了一下图谱问答的实现方案
2022-05-30
- 改图谱抽取生成图谱的代码bug
2022-05-31
- 打包paddlenlp相关模型文件;调试其他抽取schema
2022-06-01
- Paddlepaddle-gpu版本使用时报错(docker版本): 去宿主机上把
/usr/local/cuda
复制到docker的/usr/local
下面,再去~/.bashrc
里面添加以下环境变量:export LD_LIBRARY_PATH="/usr/local/cuda/lib64"
2022-06-02
- 看股权穿透的老代码,正在找节点id字段在数据库里面的那个表(又或者是咋生成的)
- 开发比例超过百分之十的对外投资查询接口(需求特么他自己搞清楚了么.....)
2022-06-06
- 编写按照穿透方向返回单层数据的单层股权穿透接口
2022-06-07
- 更改带有条件的对外投资接口的返回数据格式
- 写专利的权利说明书
2022-06-08
- 完成专利的剩余部分
2022-06-09
- 改了一下个人查询的接口
2022-06-10
- 写了一个单独查询个人信息的接口(java的null和""是有区别的)
2022-06-13
- 上网查金融领域的相关schema,没查到啥有用的
- 又试了下uie抽取很详细的实体,也能抽出来
2022-06-14
- 写demo代码,给前端渲染用的
2022-06-15
- 完成了浙商年报的图谱抽取封装的代码实现
- 构思任职关系去重的实现方法
2022-06-16
- java的equals和==
- 个人查询接口任职关系去重加合并
2022-06-17
- 配合后端测试接口
- 重写图谱
2022-06-20
- 完成了uie知识抽取的接口实现
2022-06-21
- 完成知识抽取到入库接口的开发
- 完成简单知识问答接口的开发
2022-06-22
- 撰写大厂分布式产品调研报告
2022-06-23
- 完成了大厂分布式产品调研报告
2022-06-24
- 和专利事务所共同修改专利
- 前端无法登陆有可能是nigix的ip_hash分发路由配置错误
2022-06-27
- 修改专利,完成定稿
- 修改知识抽取数据封装接口
2022-06-28
- 修改知识抽取项目的数据库插入接口和问答接口
2022-06-29
- 构建金融知识抽取的训练数据
2022-06-30
- 对集团查询接口新增任职关系合并的操作
2022-07-01
- 梳理股权穿透接口的返回数据逻辑
- 标注数据
2022-07-04
- 数据标注完毕,导出为jsonl文件
- 制作接口参数文档
2022-07-05
- 在内网对模型进行微调,转换训练文件时出错,正在解决中......
2022-07-06
- json.load()、json.loads()、json.dump()和json.dumps()
- python命令加上-u(unbuffered)参数后会强制其标准输出也同标准错误一样不通过缓存直接打印到屏幕
-
- ONNX (Open Neural Network Exchange)- 开放神经网络交换格式,作为框架共用的一种模型交换格式,使用 protobuf 二进制格式来序列化模型,可以提供更好的传输性能我们可能会在某一任务中将 Pytorch 或者 TensorFlow 模型转化为 ONNX 模型(ONNX 模型一般用于中间部署阶段),然后再拿转化后的ONNX模型进而转化为我们使用不同框架部署需要的类型,ONNX 相当于一个翻译的作用。
2022-07-07
- 和问答前端联调代码
- 完善抽取问答项目方案书
2022-07-08
- 重新标注训练模型
2022-07-11
- 重写抽取问答接口逻辑
2022-07-12
- 继续重写抽取问答项目的后端接口
2022-07-13
- 配合前端完成关系图谱接口的数据封装;分析后端是否有bug
2022-07-14
- 分析年报可标注的schema
2022-07-15
- 看图卷积的ppt
2022-07-18
- 构思如何将组织机构与抽取得到的金融指标实体进行关联
- 开组会
2022-07-19
- 用建行的年报测试接口,根据新出现的状况修改完善抽取封装逻辑