`
hugh.wangp
  • 浏览: 288956 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Neo4j-Cypher查询语言-模式(Patterns)

阅读更多
模式是Cypher非常核心的东西,它在很多地方被用到。利用模式,你可以描述你要找的数据是什么样子。模式是被用在MATCH子句中。路径模式是表达式。Since these expressions are collections, they can also be used as predicates (a non-empty collection signifies true)。他们被用来CREATE/CREATE UNIQUE一个图。
所以,理解模式非常重要。
当你申明一个模式时,Cypher会指出怎么获取数据。想法是编写查询,指定你想要的模式,你就能够利用这些值创建你想要的结果。
模式必须有个开始节点,模式必须要作用在图节点集合或者图关系集合上。所有模式都要直接或者间接地和开始节点关联起来。一个没有任何开始节点的模式都会被拒绝

 

相关节点的模式(Patterns for related nodes)
模式是由一个或者多个路径组成,路径直接用逗号分隔。一个路径就是一个节点和关系的序列,这个序列指定开始和结束的节点。例如(a)-->(b)

这个路径开始于节点a,通过outgoing关系指向节点b

路径可以随意地长,并且同一个节点可能在路径的不同部分出现
节点标识可以带括号,也可以不带括号: a-->b和(a)-->(b)完全一样
如果你不在乎具体是哪个节点,不用指定它,只需用空括号来表示就OK了:a-->()-->b

结合关系的模式(Working with relationships)
如果需要指定两个节点之间的关系,可以如下做:a-[r]->b
如果你不在乎关系的方向,你可以省去关系的箭头:a--b
当你只关注特定关系类型时,你可以这么做:a-[:REL_TYPE]->b
你也可以指定多个关系类型,罗列各个关系,用管道符号"|"连接:a-[r:TYPE1|TYPE2]->b。这个模式就是在节点a到节点b匹配关系TYPE1或者TYPE2。这两个关系的别名为r。多关系类型不能用在CREATE和CREATE UNIQUE子句中

可选关系(Optional relationships)
当关系存在,可选关系就能匹配到数据,但是不存在关系,则返回null。与SQL的外关联类似,Cypher如果匹配到关系,返回数据,如果没有匹配到返回null。可选关系只能用在MATCH子句中。
可选关系用"?"标识,例如:

Query

1
2
3
START me=node(*)
MATCH me-->friend-[?]->friend_of_friend
RETURN friend, friend_of_friend
这个语句是找到任何节点的朋友,及朋友的朋友(如果有的话)。
可选是传递的,如果模式的一部分是由可选关系得到的,那么这部分也是可选的,如上查询,friend和friende_of_friend的关系是可选的,那么friend_of_friend也是可选的。
同时,一个路径包含了可选的部分,那么这个路径也是可选的--如果一个路径的任一部分是null,那么这个路径也是null
下面的例子中,b和p都是可选的:

Query

1
2
3
START a=node(4)
MATCH p = a-[?]->b
RETURN b

Query

1
2
3
START a=node(4)
MATCH p = a-[?*]->b
RETURN b

Query

1
2
3
START a=node(4)
MATCH p = a-[?]->x-->b
RETURN b

Query

1
2
3
START a=node(4), x=node(3)
MATCH p = shortestPath( a-[?*]->x )
RETURN p

控制关系的深度(Controlling depth)
一个模式关系可以跨越多重的图关系,这种关系叫做可变深度关系。这种关系用"*"标识:(a)-[*]->(b),这表示从节点a开始到节点b,中间是一种outgoing的关系,但不限定经过几次关系找到节点b。这是一个比较重的查询,依托于图的结构,可能遍历很多层关系,也可能遍历很少的关系。
不过,可以设置关系匹配的最短路径和最长路径,关系标识为:-[:relType*minStep..maxStep]->
例如:(a)-[*3..5]->(b) 表示从a到b包含最少3层关系,最多5层关系
可变深度关系不能用于CREATE或CREATE UNIQUE

指定路径标识符(Assigning to path identifiers)
在图数据库里,路径是很重要的概念。路径是一个节点与关系的集合,描述图中的一个路径信息。可以用路径标识符指定一个路径:p=(a)-[*3..5]->(b)
可以在MATCH,CREATE和CREATE UNIQUE子句中,但模式作为表达式时不能使用。在如下的一个查询中看下如何用于这三个子句中

Query

1
2
3
4
5
START me=node(3)
MATCH p1 = me-[*2]-friendOfFriend
CREATE p2 = me-[:MARRIED_TO]-(wife {name:"Gunhild"})
CREATE UNIQUE p3 = wife-[:KNOWS]-friendOfFriend
RETURN p1,p2,p3

设置属性(Setting properties)
节点和关系是重要的,但是Neo4j在节点和关系上使用属性,也可以用于稠密图模型(Neo4j uses properties on both of these to allow for far denser graphs models)
单个属性在模式中用Map结构来表示,属性集合是把各个Map形式的属性放在大括号里,各个属性直接用逗号隔开:{ name: "Andres", sport: "BJJ" }。如果一个属性(Map)参数化(paramName),那属性集合可以这样表示{paramName}
Maps只能用在CREATE和CREATE UNIQUE子句中。
在CREATE子句中,用于设置节点或者关系的属性。
在CREATE UNIQUE子句中,它用于匹配图中相关的元素,可能成功,也可能不成功。如果模式元素中的属性能绝对匹配图中元素的属性(图元素可以有多余的其他属性,但不影响匹配),那么匹配成功。如果在图元素中没有找到模式中的属性,那么这些属性就用来设置新创建元素的属性。
  • 大小: 20.6 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics