相比图形数据的查询,Neo4j更新图形数据的速度较慢,通常情况下,Neo4j更新数据的工作流程是:每次数据更新都会执行一次数据库连接,打开一个事务,在事务中更新数据。当数据量非常大时,这种做法非常耗时,大多数时间耗费在连接数据库和打开事务上,高效的做法是利用Neo4j提供的参数(Parameter)机制和UNWIND子句:在一次数据更新中,进行一次连接,打开一次事务,批量更新数据;参数用于提供列表格式的数据,UNWIND子句是把列表数据展开成一行一行的数据,每行数据都会执行结构相同的Cypher语句。再批量更新图形数据之前,用户必须构造结构固定的、参数化的Cypher语句。当Cypher语句的结构相同时,Neo4j数据库直接从缓存中复用已生成的执行计划,而不需要重新生成,这也能够提高查询性能。

Continue reading

本文使用的IDE是Visual Studio 2015 ,驱动程序是Neo4j官方的最新版本:Neo4j Driver 1.3.0 ,创建的类库工程(Project)要求安装 .NET Framework 4.6版本,Neo4j官方提供的驱动程序使用起来非常简单,非常依赖于Cypher语言,但是,官方驱动程序仅支持标量类型的参数(Parameters),由于Neo4j的批量更新,例如,Cypher语言的foreach,unwind命令等用于批量操作,非常依赖于参数,这也成了官方驱动最大的缺点。

Continue reading

Neo4j 第三篇:Cypher查询入门

Neo4j使用Cypher查询图形数据,Cypher是描述性的图形查询语言,语法简单,功能强大,由于Neo4j在图形数据库家族中处于绝对领先的地位,拥有众多的用户基数,使得Cypher成为图形查询语言的事实上的标准。本文作为入门级的教程,我不会试图分析Cypher语言的全部内容,本文的目标是循序渐进地使用Cypher语言执行简单的CRUD操作,为了便于演示,本文在Neo4j Browser中执行Cypher示例代码。以下图形包含三个节点和两个关系,本文会一步一步讲解如何利用Cypher语言创建以下图形。
Continue reading

一,图形数据库的基本概念

Neo4j创建的图(Graph)基于属性图模型,在该模型中,每个实体都有ID(Identity)唯一标识,每个节点由标签(Lable)分组,每个关系都有一个唯一的类型,属性图模型的基本概念有:

  • 实体(Entity)是指节点(Node)和关系(Relationship);
    • 每个实体都有一个唯一的ID;
    • 每个实体都有零个,一个或多个属性,一个实体的属性键是唯一的;
    • 每个节点都有零个,一个或多个标签,属于一个或多个分组;
    • 每个关系都只有一个类型,用于连接两个节点;
  • 路径(Path)是指由起始节点和终止节点之间的实体(节点和关系)构成的有序组合;
  • 标记(Token)是非空的字符串,用于标识标签(Lable),关系类型(Relationship Type),或属性键(Property Key);
    • 标签:用于标记节点的分组,多个节点可以有相同的标签,一个节点可以有多个Lable,Lable用于对节点进行分组;
    • 关系类型:用于标记关系的类型,多个关系可以有相同的关系类型;
    • 属性键:用于唯一标识一个属性;
  • 属性(Property)是一个键值对(Key/Value Pair),每个节点或关系可以有一个或多个属性;属性值可以是标量类型,或这标量类型的列表(数组);

二,图形示例
Continue reading

所属分类:NoSQL

 Cypher介绍

“Cypher”是一个描述性的图形查询语言,允许不必编写图形结构的遍历代码对图形存储有表现力和效率的查询。Cypher还在继续发展和成熟,这也就意味着有可能会出现语法的变化。同时也意味着作为组件没有经历严格的性能测试。

Cypher设计的目的是一个人类查询语言,适合于开发者和在数据库上做点对点模式(ad-hoc)查询的专业操作人员(我认为这个很重要)。它的构念是基于英语单词和灵巧的图解。

Cyper通过一系列不同的方法和建立于确定的实践为表达查询而激发的。许多关键字如like和order by是受SQL的启发。模式匹配的表达式来自于SPARQL。正则表达式匹配实现实用Scala programming language语言。

Cypher是一个申明式的语言。对比命令式语言如Java和脚本语言如Gremlin和JRuby,它的焦点在于从图中如何找回(what to retrieve),而不是怎么去做。这使得在不对用户公布的实现细节里关心的是怎么优化查询。

Continue reading

欢迎各路大神临幸寒舍

以下节点标签为people,friend,用户自己也可以设置成其他标签,查询时需要用到标签。这个标签可以类比为关系数据库中的表名

创建节点、关系

创建节点(小明):create (n:people{name:’小明’,age:’18’,sex:’男’})  return  n;
创建节点(小红): create (n:people{name:’小红’,age:’18’,sex:’女’})  return  n;
创建关系(小明送礼物给小红):小明节点id0,小红节点id1
start a =node(0),b=node(1) create (a)-[n:gift]->(b)return n

Continue reading