Cypher介绍
“Cypher”是一个描述性的图形查询语言,允许不必编写图形结构的遍历代码对图形存储有表现力和效率的查询。Cypher还在继续发展和成熟,这也就意味着有可能会出现语法的变化。同时也意味着作为组件没有经历严格的性能测试。
Cypher设计的目的是一个人类查询语言,适合于开发者和在数据库上做点对点模式(ad-hoc)查询的专业操作人员(我认为这个很重要)。它的构念是基于英语单词和灵巧的图解。
Cyper通过一系列不同的方法和建立于确定的实践为表达查询而激发的。许多关键字如like和order by是受SQL的启发。模式匹配的表达式来自于SPARQL。正则表达式匹配实现实用Scala programming language语言。
Cypher是一个申明式的语言。对比命令式语言如Java和脚本语言如Gremlin和JRuby,它的焦点在于从图中如何回(what to retrieve),而不是怎么去做。这使得在不对用户公布的实现细节里关心的是怎么优化查询。
这个查询语言包含以下几个明显的部分:
  START:在图中的开始点,通过元素的ID或所以查获得。
  MATCH:图形的匹配模式,束缚于开始点。
  WHERE:过滤条件。
  RETURN:返回所需要的。
在下例中看三个关键字
示例图片如下:
如:这个有个查询,通过遍历图到索引里一个叫John的朋友的朋友(不是他的直接朋友),返回John和到的朋友的朋友。
START john=node:node_auto_index(name = 'John')
MATCH john-[:friend]->()-[:friend]->fof
RETURN john, fof
返回结果:
下一步添加过滤:
在下一个例子中,列出一组用户的id并遍历图查这些用户接出friend关系线,返回有属性name并且其值是以S开始的用户。
START user=node(5,4,1,2,3)
MATCH user-[:friend]->follower
WHERE  =~ /S.*/
RETURN user,
返回结果:
操作符
Cypher中的操作符有三个不同种类:数学,相等和关系。
数学操作符有+,-,*,/和%。当然只有+对字符有作用。
等于操作符有=,<>,<,>,<=,>=。
因为Neo4j是一个模式少的图形数据库,Cypher有两个特殊的操作符和!。
有些是用在属性上,有些事用于处理缺少值。对于一个不存在的属性做比较会导致错误。为替代与其他什么做比较时总是检查属性是否存在,在缺失属性时问号将使得比较总是返回true,感叹号使得比较总是返回false。
= "foo"
这个断言在属性缺失情况下将评估为true。
! = "foo"
这个断言在属性缺失情况下将评估为false。
警告:在同一个比较中混合使用两个符号将导致不可预料的结果。
参数
Cypher支持带参数的查询。这允许开发者不需要必须构建一个string的查询,并且使得Cypher的查询计划的缓存更容易。
参数可以在where子句,start子句的索引key或索引值,索引查询中作为节点/关系id的引用。
以下是几个在java中使用参数的示例:
节点id参数
Map<String, Object> params = new HashMap<String, Object>();
( "id", 0 );
ExecutionResult result = ( "start n=node({id}) return ", params );
节点对象参数
Map<String, Object> params = new HashMap<String, Object>();
( "node", andreasNode );
ExecutionResult result = ( "start n=node({node}) return ", params );
多节点id参数
Map<String, Object> params = new HashMap<String, Object>();
( "id", ( 0, 1, 2 ) );
ExecutionResult result = ( "start n=node({id}) return ", params );
字符串参数
Map<String, Object> params = new HashMap<String, Object>();
( "name", "Johan" );
ExecutionResult result = ( "start n=node(0,1,2) where  = {name} return n", params );
索引键值参数
Map<String, Object> params = new HashMap<String, Object>();
( "key", "name" );
( "value", "Michaela" );
ExecutionResult result = ( "start n=node:people({key} = {value}) return n", params );
索引查询参数
Map<String, Object> params = new HashMap<String, Object>();正则匹配中配到到带单引号
( "query", "name:Andreas" );
ExecutionResult result = ( "start n=node:people({query}) return n", params );
  SKIP 与LIMIT * 的数字参数
Map<String, Object> params = new HashMap<String, Object>();
( "s", 1 );
( "l", 1 );
ExecutionResult result = ( "start n=node(0,1,2) return  skip {s} limit {l}", params );

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。