Hello world

Neo4j 图由以下部分组成

  • 节点

  • 连接节点的关联

  • 节点和关联上的属性

所有关联都有一个类型。例如,如果图表示一个社交网络,关联类型可以是 KNOWS。如果类型为 KNOWS 的关联连接两个节点,则很可能表示两个人彼此认识。图的许多语义都编码在应用程序的关联类型中。虽然关联是有方向的,但无论方向如何,它们都同样可以被遍历。

有关项目设置的信息,请参阅将 Neo4j 嵌入到您的 Java 应用程序中

此示例的源代码位于:EmbeddedNeo4j.java

准备数据库

关联类型可以使用 enum 创建。在此示例中,您只需要一个关联类型。定义方式如下

private enum RelTypes implements RelationshipType
{
    KNOWS
}

您还可以准备一些变量以供使用

GraphDatabaseService graphDb;
Node firstNode;
Node secondNode;
Relationship relationship;
private DatabaseManagementService managementService;

下一步是启动数据库服务器。请注意,如果为数据库指定的目录尚不存在,则会创建它。

managementService = new DatabaseManagementServiceBuilder( databaseDirectory ).build();
graphDb = managementService.database( DEFAULT_DATABASE_NAME );
registerShutdownHook( managementService );

启动数据库服务器是一项开销很大的操作,因此不要在每次需要与数据库交互时都启动一个新实例。该实例可以由多个线程共享,并且事务是线程受限的。

如您所见,您可以注册一个关闭钩子,以确保数据库在 JVM 退出时关闭。

private static void registerShutdownHook( final DatabaseManagementService managementService )
{
    // Registers a shutdown hook for the Neo4j instance so that it
    // shuts down nicely when the VM exits (even if you "Ctrl-C" the
    // running application).
    Runtime.getRuntime().addShutdownHook( new Thread()
    {
        @Override
        public void run()
        {
            managementService.shutdown();
        }
    } );
}

下一步是与数据库交互。

将操作封装在事务中

所有操作都必须在事务中执行。这是一项深思熟虑的设计决策,因为事务边界是使用真实企业数据库的重要组成部分。以下示例说明了 Neo4j 中的事务处理

try ( Transaction tx = graphDb.beginTx() )
{
    // Database operations go here
    tx.commit();
}

有关事务的更多信息,请参阅事务管理以及org.neo4j.graphdb.Transaction 的 Neo4j Javadoc

为简洁起见,本手册中不再详细说明将操作封装在事务中。

创建小型图

现在您可以创建一些节点了。以下是创建由两个节点、一个关联和一些属性组成的小型图的方法

firstNode = tx.createNode();
firstNode.setProperty( "message", "Hello, " );
secondNode = tx.createNode();
secondNode.setProperty( "message", "World!" );

relationship = firstNode.createRelationshipTo( secondNode, RelTypes.KNOWS );
relationship.setProperty( "message", "brave Neo4j " );

您现在有一个如下图所示的图

hello world graph java

打印结果

创建图后,您可以从中读取并打印结果。

System.out.print( firstNode.getProperty( "message" ) );
System.out.print( relationship.getProperty( "message" ) );
System.out.print( secondNode.getProperty( "message" ) );

输出结果如下

Hello, brave Neo4j World!

有关如何在 Neo4j 浏览器中查看图的更多信息,请参阅浏览器手册 → 专用 Web 服务器

删除数据

在此情况下,数据在提交之前被移除

// let's remove the data
firstNode = tx.getNodeById( firstNode.getId() );
secondNode = tx.getNodeById( secondNode.getId() );
firstNode.getSingleRelationship( RelTypes.KNOWS, Direction.OUTGOING ).delete();
firstNode.delete();
secondNode.delete();

在事务提交时删除仍有关联的节点将失败。这是为了确保关联始终具有起始节点和结束节点。

关闭数据库服务器

最后,在应用程序完成时关闭数据库服务器:

managementService.shutdown();
© . All rights reserved.