知识图谱java实现_知识图谱:neo4j(四)Java API
知识图谱:neo4j(四)Java API
知识图谱:neo4j(四)Java API
Neo4j Java API
Neo4j 提供 JAVA API 以编程方式执行所有数据库操作。它支持两种类型的API:
1、Neo4j 原生的 Java API
2、Neo4j Cypher Java API
Neo4j 原生 Java API 是一种低级别的纯 JAVA API,用于执行数据库操作。Neo4j Cypher Java API 是简单而强大的 JAVA API,用于执行所有CQL命令以执行数据库操作。
环境配置
CentOS 6.9
Neo4j 3.5.3 [安装教程]
IDEA 2018.1 [安装教程]
Maven 3.1.1 [安装教程]
实验
1. 创建SpringBoot项目
因为Neo4j依赖的jar包比较多,所以推荐使用Maven来管理。
这步不操作也行,该案例中用不到...
在 pom.xml 中添加依赖
org.neo4j
neo4j
3.5.3
2. 新建一个Java类 Neo4jNativeJavaAPI
3. 导入需要的库包
import java.io.File;
import org.neo4j.graphdb.Direction;
import org.neo4j.graphdb.GraphDatabaseService;
import org.neo4j.graphdb.Label;
import org.neo4j.graphdb.Node;
import org.neo4j.graphdb.Relationship;
import org.neo4j.graphdb.RelationshipType;
import org.neo4j.graphdb.Transaction;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
或者
import java.io.File;
import org.neo4j.graphdb.*;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
4. 无论是创建一个新的数据库,还是打开一个已有的数据库,首先都需要创建一个GraphDatabaseService实例
// GraphDatabaseService实例可以被多个线程共享,但是一个数据库只允许有一个Service实例
GraphDatabaseService graphDB = new GraphDatabaseFactory().newEmbeddedDatabase( DB_PATH );
可以对数据库进行一些配置(更多配置信息可以看GraphDatabaseSettings类的文档
GraphDatabaseService graphDB = new GraphDatabaseFactory()
.newEmbeddedDatabaseBuilder( testDirectory.graphDbDir() )
.setConfig( GraphDatabaseSettings.pagecache_memory, "512M" )
.setConfig( GraphDatabaseSettings.string_block_size, "60" )
.setConfig( GraphDatabaseSettings.array_block_size, "300" )
.newGraphDatabase();
为了确保数据库正确地关闭,可添加一个ShutdownHook来实现关闭数据库的动作。关闭数据库可以调用shutdown()方法
private static void registerShutdownHook(final GraphDatabaseService graphDb) {
Runtime.getRuntime().addShutdownHook(new Thread() {
@Override
public void run() {
graphDb.shutdown();
}
});
}
5. 创建节点和关系
关系、Label类型可以通过枚举enum创建
// Label类型枚举类
private static enum MyLabels implements Label {
MOVIES, USERS
}
//关系类型枚举类
private static enum MyRelationshipTypes implements RelationshipType {
IS_FRIEND_OF, HAS_SEEN
}
6. 在Neo4j中,对于数据库的操作需要在一个事务transaction中执行
try ( Transaction tx = graphDb.beginTx() ){
// 数据库操作写在事务提交之前
tx.success();
}
7. 汇总上述并给出一个案例
import org.neo4j.graphdb.*;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
import java.io.File;
public class Neo4jNativeJavaAPI {
private static void registerShutdownHook(final GraphDatabaseService graphDB) {
Runtime.getRuntime().addShutdownHook(
new Thread() {
public void run() {
System.out.println("Server is shutting down");
graphDB.shutdown();
}
}
);
}
//Label类型枚举类
private static enum MyLabels implements Label {
MOVIES, USERS
}
//关系类型枚举类
private static enum MyRelationshipTypes implements RelationshipType {
IS_FRIEND_OF, HAS_SEEN
}
public static void main(String[] args) {
//指定 Neo4j 存储路径
File file = new File("/usr/local/neo4j/data/databases/test.db");
//Create a new Object of Graph Database
GraphDatabaseService graphDB = new GraphDatabaseFactory().newEmbeddedDatabase(file);
System.out.println("Server is up and Running");
try(Transaction tx = graphDB.beginTx()){
//新增Actor节点 添加Label以区分节点类型 每个节点设置name属性
Node actor1 = graphDB.createNode(MyLabels.ACTORS);
actor1.setProperty("name", "John Johnson");
Node actor2 = graphDB.createNode(MyLabels.ACTORS);
actor2.setProperty("name", "Kate Smith");
Node actor3 = graphDB.createNode(MyLabels.ACTORS);
actor3.setProperty("name", "Jack Jeffries");
/**
* 为user1添加Friend关系
* 注:Neo4j的关系是有向的箭头,正常来讲Friend关系应该是双向的,
* 此处为了简单起见,将关系定义成单向的,不会影响后期的查询
*/
actor1.createRelationshipTo(user2,MyRelationshipTypes.IS_FRIEND_OF);
actor1.createRelationshipTo(user3,MyRelationshipTypes.IS_FRIEND_OF);
/**
* 新增Movie节点
* 添加Lable以区分节点类型
* 每个节点设置name属性
*/
Node movie1 = graphDB.createNode(MyLabels.MOVIES);
movie1.setProperty("name", "Fargo");
Node movie2 = graphDB.createNode(MyLabels.MOVIES);
movie2.setProperty("name", "Alien");
Node movie3 = graphDB.createNode(MyLabels.MOVIES);
movie3.setProperty("name", "Heat");
/**
* 为User节点和Movie节点之间添加HAS_SEEN关系, HAS_SEEN关系设置stars属性
*/
Relationship relationship1 = user1.createRelationshipTo(movie1, MyRelationshipTypes.HAS_SEEN);
relationship1.setProperty("stars", 5);
Relationship relationship2 = user2.createRelationshipTo(movie3, MyRelationshipTypes.HAS_SEEN);
relationship2.setProperty("stars", 3);
Relationship relationship6 = user2.createRelationshipTo(movie2, MyRelationshipTypes.HAS_SEEN);
relationship6.setProperty("stars", 6);
Relationship relationship3 = user3.createRelationshipTo(movie1, MyRelationshipTypes.HAS_SEEN);
relationship3.setProperty("stars", 4);
Relationship relationship4 = user3.createRelationshipTo(movie2, MyRelationshipTypes.HAS_SEEN);
relationship4.setProperty("stars", 5);
tx.success();
System.out.println("Done successfully");
} catch (Exception e) {
e.printStackTrace();
} finally {
graphDB.shutdown(); //关闭数据库
}
//Register a Shutdown Hook
registerShutdownHook(graphDB);
}
}
运行后却报错了:Error starting org.neo4j.graphdb.facade.GraphDatabaseFacadeFactory
在网上没有找到明确的解决办法,但找到类似的 [链接],说是因为已经成功初始化,但是在继续初始化启动就会报错,那很简单的解决方法就是把neo4j安装目录下的/data/databases里面的所有文件都删除掉(可以先备份再删掉),操作后再运行程序成功了
由于neo4j默认启动的是graph.db数据库,而我们这里用了新的数据库test.db,所以到/conf/neo4j.conf修改配置
启动neo4j
浏览器打开http://localhost:7474
8. 再创建一个Java类Neo4jCypherJavaAPI,用 Cypher 对上图进行查询
import org.neo4j.graphdb.*;
import org.neo4j.graphdb.factory.GraphDatabaseFactory;
import java.io.File;
public class Neo4jCypherJavaAPI {
public static void main(String[] args) {
//指定 Neo4j 存储路径
File file = new File("/usr/local/neo4j/data/databases/test.db");
//Create a new Object of Graph Database
GraphDatabaseService graphDB = new GraphDatabaseFactory().newEmbeddedDatabase(file);
System.out.println("Server is up and Running");
try(Transaction tx = graphDB.beginTx()){
//通过Cypher查询获得结果
StringBuilder sb = new StringBuilder();
sb.append("MATCH (john)-[:IS_FRIEND_OF]->(USER)-[:HAS_SEEN]->(movie) ");
sb.append("RETURN movie");
Result result = graphDB.execute(sb.toString());
//遍历结果
while(result.hasNext()){
//get("movie")和查询语句的return movie相匹配
Node movie = (Node) result.next().get("movie");
System.out.println(movie.getId() + " : " + movie.getProperty("name"));
}
tx.success();
System.out.println("Done successfully");
} catch (Exception e) {
e.printStackTrace();
} finally {
graphDB.shutdown(); //关闭数据库
}
}
}
更多
1. 上述代码主要实现的是创建(CREATE)节点和关系,也可以进行更新、查询、删除等
try (Transaction tx = graphDB.beginTx()) {
// 查询节点
Node node = graphDB.findNode(MyLabels.ACTORS, "name", "John Johnson");
System.out.println("query node name is " + node.getProperty("name"));
// 更新节点
node.setProperty("birthday", "1979-01-18");
System.out.println(node.getProperty("name") + "'s birthday is " +
node.getProperty("birthday", new String()));
// 删除关系和节点
Relationship relationship = node.getSingleRelationship(MyRelationshipTypes.IS_FRIEND_OF, Direction.OUTGOING);
relationship.delete();
relationship.getStartNode().delete();
node.delete();
// 提交事务
tx.success();
}
2. Neo4j可以以两种方式运行 [链接]:
2.1 Java应用程序中的嵌入式数据库(如:本篇博文用的该方式
嵌入式Neo4j数据库是性能的最佳选择。 它运行在相同的客户端应用程序的进程托管它并将数据存储在给定的路径中。
2.2 通过REST的独立服务器(如:基于电影知识图谱的智能问答系统 用的该方式
作为独立应用程序,它比嵌入式配置更安全(客户端中的潜在故障不会影响服务器),并且更易于监控。要连接到Neo4j服务器,必须使用REST API,可以使用Python,.NET,Java,Go,PHP,Ruby,Node.js等。使用服务器开发的方式,Neo4j必须是开启的状态
参考
CSDN 修行修心:图数据库 Neo4j 之 Java Api 的使用
博客园 没课割绿地:Neo4j学习笔记(1)——使用Java API实现简单的增删改查
CSDN Karenmaxx:Springboot连接Neo4j 完整版(提供代码)
知识图谱:neo4j(四)Java API相关教程
知识图谱java实现_知识图谱:neo4j(四)Java API相关推荐
- java书籍_非科班,自学java需要把软件工程的课程全部学习完吗?
问题一:非科班是否能自学Java.问题二:自学Java是否需要把软件工程课程全部学完?问题三:如何自学Java? 解决问题一:非科班是否能自学Java.不知道你是否有这个担心疑虑,从事Java技术开发 ...
- 双表查询java代码_什么是JDBC?Java数据库连接性简介
JDBC(Java数据库连接性)是Java API,用于管理与数据库的连接,发出查询和命令以及处理从数据库获得的结果集.JDBC在1997年作为JDK 1.1的一部分发布,是为Java持久层开发的首批 ...
- java安装_我最喜欢的Java高级开发人员书籍
java安装 我上一篇博客文章(我对高级Java开发人员的十个最喜欢的在线资源)的想法,是由Xiaoran Wang发表的 "面向高级Java开发人员的十大网站"的启发. Wang ...
- java超线程_超线程多核心下Java多线程编程技术分析
在学习编程的过程中,我觉得不止要获得课本的知识,更多的是通过学习技术知识提高解决问题的能力,这样我们才能走在最前方,本文主要讲述超线程多核心下Java多线程编程技术分析,更多Java专业知识,广州疯狂 ...
- 高级java开发_我最喜欢的Java高级开发人员书籍
高级java开发 我上一篇博客文章 (我对高级Java开发人员的十个最喜欢的在线资源)的想法,是由Xiaoran Wang发表的"面向高级Java开发人员的十大网站"的启发. Wa ...
- oracle java认证_如何通过Oracle的Java认证-开发人员实用指南
oracle java认证 by javinpaul 由javinpaul 如何通过Oracle的Java认证-开发人员实用指南 (How to Pass Oracle's Java Certific ...
- java组件_三个必不可少的Java平台组件:什么是JVM,JDK,JRE?有啥区别?
刚接触Java的开发人员经常想知道Java虚拟机,Java开发工具包和Java运行时环境与众不同的地方.他们也很好奇这三个Java平台组件如何在Java应用程序中一起工作.最后,开发人员需要知道他们将 ...
- 如何java面试_短时间如何过java面试?
这题我会!作为一个编程界老司机,我曾总结过一套Java常见的面试考点大全,不知道帮助过多少程序员拿下offer. 现在我把这套Java面试大全放出来,希望对大家有所帮助! 本文内容过长,建议大家先赞后 ...
- 逻辑思维不好能学java吗_逻辑思维差可以学JAVA吗
逻辑思维就是练出来的,怎么练知道吗?学习编程的过程就是训练你逻辑思维最好最好的方法,慢慢来吧.在你思考的过程中,慢慢逻辑思维能力就有了,学java可以训练逻辑思维,这是反复迭代的过程.其实担心编程学不 ...
最新文章
- Science:又一明星菌群可以调控肠道免疫?
- NET 应用架构指导 V2 学习笔记(二十) 业务组件设计指导
- python删除文件夹无法访问_零基础小白必看:python基本操作-文件、目录及路径
- Ghost 2.16.3 发布,基于 Markdown 的在线写作平台
- HashMap底层分析_put添加元素
- (46)Verilog HDL 自动饮料机设计
- asp.net中通过HyperLinkField传值
- [INS-32025] 所选安装与指定 Oracle 主目录中已安装的软件冲突。
- Caddy – 方便够用的 HTTPS server 新手教程
- python计算机入门_Python零基础入门(1)-------计算机基础
- pcie routing
- 5G+AIoT“零碳”解决方案 | 模组助力“4S” 融合的新一代智能汽车驶入快车道
- codejock toolkit pro 源码零售版
- Android:Canvas: trying to draw too large
- java多线程那些靠谱的总结
- 计算机1946考试试题,统考计算机考试试题及答案
- 中国设备工程杂志中国设备工程杂志社中国设备工程编辑部2022年第18期目录
- python批量下载模库网图片
- u盘启动工具哪个好用
- 职场生存法则,太精辟了!
热门文章
- 【Elasticsearch】消除 Elasticsearch 中的重复文档
- 【Flink】ClassCastException 以及自定义序列化
- 【Kafka】kafka Java api 获取 kafka topic 或者 partition 占用的磁盘大小
- 【Flink】No tests found matching Method xx from org.junit.internal.requests.ClassRequest
- SpringBoot:Spring boot 主程序的功能SpringApplication.run(启动流程)
- 【Hbase】命令行load数据文件到Hbase
- Java中的switch分支语句
- Docker这么香,为啥还要K8S?
- Java多线程学习十二:悲观锁和乐观锁的本质||
- Druid:数据库连接池实现技术,由阿里巴巴提供的