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

有关事务的更多信息,请参见 事务管理Neo4j Javadocs for org.neo4j.graphdb.Transaction.

为了简洁起见,在整个手册中不会详细说明将操作包装在事务中的过程。

创建小型图

您现在可以创建一些节点。以下是如何创建一个包含两个节点、一个关系和一些属性的小型图

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