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 " );
您现在将拥有一个看起来像这样的图
打印结果
创建图后,您可以从中读取并打印结果。
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();
删除在事务提交时仍具有关系的节点将失败。这样做是为了确保关系始终具有起始节点和结束节点。 |