精华 Neo4j学习笔记(1)——使用Java API实现简单的增删改查
发布于 19 天前 作者 pangguoming 151 次浏览 最后一次编辑是 8 天前 来自 分享

阅读目录

项目的创建及配置
使用嵌入式数据库
创建节点和关系
查询及更新
删除关系和节点
完整代码
参考资料

项目的创建及配置

因为Neo4j依赖的jar包比较多,所以推荐使用Maven来管理。 首先创建一个Maven Project,添加依赖:

 <dependency>
     <groupId>org.neo4j</groupId>
     <artifactId>neo4j</artifactId>
     <version>3.2.6</version>
 </dependency>

使用的是3.2.6版本,对应版本的Neo4j安装地址摸我。 回到顶部

使用嵌入式数据库

配置好之后,就可以开始了,第一步是学习开启和关闭数据库。

无论是创建一个新的数据库,还是打开一个已有的数据库,首先都需要创建一个GraphDatabaseService实例。

 graphDb = new GraphDatabaseFactory().newEmbeddedDatabase( DB_PATH );

GraphDatabaseService实例可以被多个线程共享,但是一个数据库只允许有一个Service实例。

关闭数据库可以调用shutdown()方法。 为了确保数据库正确地关闭,可以添加一个ShutdownHook来实现关闭数据库的动作。

 private static void registerShutdownHook(final GraphDatabaseService graphDb) {
         Runtime.getRuntime().addShutdownHook(new Thread() {
             @Override
             public void run() {
                 graphDb.shutdown();
             }
         });
     }

还可以通过API对数据库的一些配置进行设置。 一种方法是加载.conf配置文件。

 GraphDatabaseService graphDb = new GraphDatabaseFactory()
     .newEmbeddedDatabaseBuilder( testDirectory.graphDbDir() )
     .loadPropertiesFromFile( pathToConfig + "neo4j.conf" )
     .newGraphDatabase();

另一种方法就是通过方法来添加。

 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();

创建一个只读的数据库,数据库必须已经存在。

graphDb = new GraphDatabaseFactory().newEmbeddedDatabaseBuilder( dir )
         .setConfig( GraphDatabaseSettings.read_only, "true" )
         .newGraphDatabase(); 

更多配置信息可以看GraphDatabaseSettings类的文档。

创建节点和关系

图数据库是一个有向图,由通过关系Relationships连接的节点Nodes构成,节点和关系可以有自己的属性Properties。

关系的类型可以通过枚举enum创建(Label也可以):

 private static enum RelTypes implements RelationshipType
 {
     RELEASED;
 }

在Neo4j中,对于数据库的操作需要在一个事务transaction中执行。

 try ( Transaction tx = graphDb.beginTx() )
 {
     // 数据库操作写在事务提交之前
     tx.success();
 }

下面是一个简单的实例,实现了节点和关系的创建。

 try (Transaction tx = graphDb.beginTx()) {
             // 创建标签
             label1 = Label.label("Musician");
             label2 = Label.label("Album");
             // 创建节点
             node1 = graphDb.createNode(label1);
             node1.setProperty("name", "Jay Chou");
             node2 = graphDb.createNode(label2);
             node2.setProperty("name", "Fantasy");
             // 创建关系及属性
             relationship = node1.createRelationshipTo(node2, RelTypes.RELEASED);
             relationship.setProperty("date", "2001-09-14");
             // 结果输出
             System.out.println("created node name is" + node1.getProperty("name"));
             System.out.println(relationship.getProperty("date"));
             System.out.println("created node name is" + node2.getProperty("name"));
             // 提交事务
             tx.success();
         }

对于节点,除了设置属性,还可以添加标签Labels。添加标签之后就相当于对节点进行了分组,使节点的查询和管理更加清晰和方便,并且提高了查询的性能。标签是一个可选项,没有标签也是可以的。

与关系数据库相比,标签相当于表名。一个节点相当于表中的一行数据,节点的属性就是字段。区别是,一个节点可以有多个标签。

可以看到我们创建了两个节点,名字是“周杰伦”和“《范特西》”,对应的标签分别是音乐家和专辑。

他们之间通过“发行”这个关系连接,其中发行的属性为发行日期。

打开Neo4j数据库,输入查询语句match (n) return n,可以看到数据被写入了进来。 index.png

查询及更新

知道了节点的标签和一条属性,就可以通过findNode()方法查询节点。 然后使用setProperty()方法来更新和添加属性。

 try (Transaction tx = graphDb.beginTx()) {
             // 查询节点
             Label label = Label.label("Musician");
             Node node = graphDb.findNode(label, "name", "Jay Chou");
             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()));
             // 提交事务
             tx.success();
         }

打开Neo4j查看结果: index.png

删除关系和节点

删除数据时,只需要执行相关实体对应的delete()方法即可。

执行删除操作时,需要遵守如下规则:删除节点时,如果该节点存在关系,则必须先删除关系。这么做的目的是保证一条关系永远有起始和结束节点。

 try (Transaction tx = graphDb.beginTx()) {
             // 获得节点
             Label label = Label.label("Album");
             Node node = graphDb.findNode(label, "name", "Fantasy");
             // 获得关系
             Relationship relationship = node.getSingleRelationship(RelTypes.Released, Direction.INCOMING);
             // 删除关系和节点
             relationship.delete();
             relationship.getStartNode().delete();
             node.delete();
             tx.success();
         }

完整代码

 package edu.heu.kg.graphdb;
 
 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;
 
 /**
  * @ClassName: GraphDatabaseHelloWorld
  * @Description: TODO
  * @author LJH
  * @date 2017年12月22日 下午4:09:33
  */
 public class GraphDatabaseHelloWorld {
 
     private static final File DB_PATH = new File("D:\\Neo4jDb");
     private static GraphDatabaseService graphDb;
 
     private static void registerShutdownHook(final GraphDatabaseService graphDb) {
         Runtime.getRuntime().addShutdownHook(new Thread() {
             @Override
             public void run() {
                 graphDb.shutdown();
             }
         });
     }
 
     private static enum RelTypes implements RelationshipType {
         RELEASED;
     }
 
     @SuppressWarnings("unused")
     private static void addData() {
         Node node1;
         Node node2;
         Label label1;
         Label label2;
         Relationship relationship;
 
         try (Transaction tx = graphDb.beginTx()) {
             // 创建标签
             label1 = Label.label("Musician");
             label2 = Label.label("Album");
             // 创建节点
             node1 = graphDb.createNode(label1);
             node1.setProperty("name", "Jay Chou");
             node2 = graphDb.createNode(label2);
             node2.setProperty("name", "Fantasy");
             // 创建关系及属性
             relationship = node1.createRelationshipTo(node2, RelTypes.Released);
             relationship.setProperty("date", "2001-09-14");
             // 结果输出
             System.out.println("created node name is " + node1.getProperty("name"));
             System.out.println(relationship.getProperty("date"));
             System.out.println("created node name is " + node2.getProperty("name"));
             // 提交事务
             tx.success();
         }
         graphDb.shutdown();
     }
 
     @SuppressWarnings("unused")
     private static void queryAndUpdate() {
         try (Transaction tx = graphDb.beginTx()) {
             // 查询节点
             Label label = Label.label("Musician");
             Node node = graphDb.findNode(label, "name", "Jay Chou");
             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()));
             // 提交事务
             tx.success();
         }
         graphDb.shutdown();
     }
 
     @SuppressWarnings("unused")
     private static void delete() {
         try (Transaction tx = graphDb.beginTx()) {
             // 获得节点
             Label label = Label.label("Album");
             Node node = graphDb.findNode(label, "name", "Fantasy");
             // 获得关系
             Relationship relationship = node.getSingleRelationship(RelTypes.RELEASED, Direction.INCOMING);
             // 删除关系和节点
             relationship.delete();
             relationship.getStartNode().delete();
             node.delete();
             tx.success();
         }
         graphDb.shutdown();
     }
 
     public static void main(String[] args) {
         graphDb = new GraphDatabaseFactory().newEmbeddedDatabase(DB_PATH);
         registerShutdownHook(graphDb);
         addData();
         // queryAndUpdate();
         // delete();
 
     }
 
 }

作者:没课割绿地 引自:http://www.cnblogs.com/justcooooode

1 回复
回到顶部