赞
踩
最开始的两行(程序3-1和程序3-2) 建立了单个user节点, 使用了Java 6(Neo4j 1.9.X) 和Java 7(Neo4j 2.0.X) 的习惯风格。这两种版本的最大区别是对事务的处理。
在这两种风格中, 第一步是实例化Neo4j数据库 , 需要提供文件系统存储数据的位置作为构造函数参数。 如果这是一个已经存在的Neo4j数据库, 就会使用这个数据库。 如果指定的位置没有数据库, Neo4j就会在那个位置创建一个空的数据库。 前面已经提到Neo4j是一个与ACID完全兼容的图形数据库, 就像其他的数据库所期望的一样, 支持所有的标准事务型属性。 当我们使用Neo4j的内嵌式数据库时, 事务的边界是由Neo4j核心Java API程序化管理的。 现在, 需要注意的是每一个访问Neo4j数据库的代码段要么在try/catch/finally(Neo4j 1.9/Java 6) 块中执行, 要么在try(用资源尝试) 块中实施(Neo4j 2.0/Java 7) , 在执行代码中就是以这样的模式管理事务的边界。
GraphDatabaseService.createNode方法创建了Neo4j数据库中的节点 。 这个方法返回了创建的节点本身, 并可以检查其属性或对其做进一步的处理。
给节点添加属性, 需要调用目标节点上的方法Node.setProperty(name,value)。 下面的程序3-5显示了如何使用核心Java API给所有的用户添加name属性。
如果需要从节点上删除属性,必须明确地使用Neo4j核心Java API: Node.removeProperty(String propertyName);
在Neo4j中, 必须给添加的每一个属性设置属性值。 换句话说, Neo4j中不允许null属性值。Neo4j支持许多不同的数据类型而且均可以应用于节点的属性值。 表3-1列出了可以使用的属性类型及其与Java相对应的数据类型。
将电影爱好者社交网络的完整模型中的电影节点创建出来:
从Neo4j数据库的角度来讲, user节点和movie节点之间没有什么不同。 在Neo4j中, 节点在默认情况下是没有类型的。 在Neo4j 1.9及以下版本中, 能够使用的最简单的策略是给每一个节点添加一个type属性, 用属性值确定节点的类型。 这是在其他NoSQL数据库技术(例如文件数据库) 中被广泛使用的一个策略, 因为这个策略很容易理解和实施。 从Neo4j 2.0版本往后, 建议的策略是利用称为“标签”的新特性。
在2.0版本中, Neo4j引进了(内置) 节点标签的概念, 帮助我们分组相似的节点。每一个节点可以有一个或多个文字描述, 它称为节点标签。 具有同样标签的节点用一种专用的方式存储, 因此它们能分为一组并可以一起使用。 Neo4j支持下列来自核心Java API且与标签相关的操作: 通过标签加载所有的节点和通过标签及属性查找标签。
节点标签是用单个方法String name() 在一个简单的界面中定义的。要创建一个标签, 可以简单地实现这种接口, 或使用Java枚举习语, 满足Lable接口的约束。
要添加标签, 应该对选定的节点使用addLabel方法。为了查找所有具有给定标签的节点, 可以在GlobalGraphOperations类上使用静态的getAllNodesWithLabel(Label label) 方法。
除查找具有给定标签的所有节点以外, Neo4j核心Java API具有查找具有给定标签和属性的所有节点的操作, 在默认情况下, Neo4j引擎通过标签和属性查找节点是以蛮力执行的(通过循环查找所有具有给定标签的节点, 并比较需要的属性名和值) 。 但是, 如果对标签和属性定义了模式索引, Neo4j引擎将会使用更快的索引查找。
建立两个节点之间的关系, 需要调用节点之一的Node.createRelationshipTo方法并需要把连接和连接类型传递给目标节点。Neo4j图形数据库是直接用关系定义起始节点和终止节点的。 当调用createRelationshipTo方法时, 调用方法所在的节点将成为起始节点, 作为参数传递的节点将成为终止节点。
在Neo4j核心Java API中, 关系是用RelationshipType接口定义的, 它定义了单个方法返回关系的名字, 下面的程序给出了示例。
在社交网络的例子中, 我们将在用户之间建立朋友关系。 要实现这一目标, 需要使用RelationshipType接口:
RelationshipType接口有一个有趣的副作用, 它定义的唯一方法(String name()) 的签名看上去与Java的所有枚举方法的签名完全一样。使用Java枚举实现Neo4j的关系类型时, 可以以一种更强类型化、 更富有表现力和更简洁的方式。 下面的程序示例用Java枚举实现同样的IS_FRIEND_OF关系类型。
可能有这样的情况, 只有在运行时才能知道关系类型, 并且仍然需要一种方法来表示它。 在这种情况下, org.neo4j.graphdb.DynamicRelationshipType类的使用将变得非常方便。下面的程序展示了用DynamicRelationshipType类如何创建IS_FRIEND_OF关系。
要使得这个社交网络的图形数据库完整, 只需要给用户和用户给电影的评级之间添加关系(称为HAS_SEEN) 即可。 HAS_SEEN关系将从user节点开始直接到movie节点, 与以前用过的IS_FRIEND_OF关系是一样的。在HAS_SEEN和IS_FRIEND_OF关系之间有一个重要的区别:HAS_SEEN关系包含用户喜欢电影的程度的额外信息(以用户给电影评级的星的数量表示) 。 因此星的数量不是user节点或movie节点的属性(因为一个用户可以为多部电影评级) 。 在Neo4j中给关系添加属性就像给节点添加属性一样简单。
使用枚举方式实现RelationshipType接口,以下程序给出了具有新的HAS_SEEN关系的更新的MyRelationshipTypes枚举。
下一步是创建节点之间的命名关系, 这可以用本章前面在用户之间添加朋友关系的方法实现。 创建关系的API调用将会返回Neo4j的Relationship对象, 并且可以通过调用Relationship.set-Property(String name, Object value)方法使用它。
Neo4j图数据库系列:
读书笔记——Neo4j实战 使用Neo4jAPI创建节点和关系
读书笔记——Neo4j实战 使用Neo4jAPI 图形遍历
读书笔记——Neo4j实战 数据索引
读书笔记——Neo4j实战 Cypher查询语言
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。