zoukankan      html  css  js  c++  java
  • Cypher-(6)-的模式(Pattern)

    模式和模式匹配是Cypher的核心,使用模式来描述所需数据的形状,该模式使用属性图的结构来描述,通常使用小括号()表示节点,-->表示关系,-[]->表示关系和关系的类型,箭头表示关系的方向。

    一,节点模式

    用小括号表示节点模式:(a),a是节点变量的名称,用于引用图中的某一个节点a。

    对于匿名的节点,可以使用()来表示,匿名的节点无法引用,通常用来表示路径中的占位节点。

    1,标签模式

    在节点变量的后面,使用 :Lable 来表示标签,标签是节点的分组,一个节点可以有一个标签,也可以有多个标签,

    比如,(a:User),(a:User:Admin)

    2,指定属性

    节点和关系都有属性,属性模式可以使用Map结构来表示,属性模式的格式是{ key:value,..},使用大括号表示一个字典,包含一个或多个键/值对:

    (a {name: 'Andres', sport: 'Brazilian Ju-Jitsu'})
    (a)-[{blocked: false}]->(b)
    

    二,关系模式

    关系模式是由节点和路径来描述的,最简单的关系模式两个节点和一个路径:

    (a)--(b)
    

    该模式表示节点a和节点b之间存在关系,不指定关系的方向。

    1,关系的名称和方向

    关系也可以被命名,Cypher使用[r]来表示关系变量:

    (a)-[r]-(b)
    

    关系是有方向的,使用箭头指定关系的方向:

    (a)-[r]->(b)
    

    注意:图中关系的方向是在创建关系时指定的,在执行Cypher查询时,如果指定关系的方向,那么沿着关系的方向进行模式匹配。

    2,关系类型

    就像节点具有标签,可以对节点进行分组,关系也可以分组,Neo4j按照关系的类型对关系进行分组

    (a)-[r:REL_TYPE]->(b)
    

    但是不像节点可以有多个标签,关系只能由一个关系类型,但是,关系的类型可以属于一个集合,这使用 | 来分割,表示关系输入集合中的任意一个类型:

    (a)-[r:TYPE1|TYPE2]->(b)
    

    三,路径模式

    路径是由节点和关系构成的序列,在路径中节点和关系是交替相连的,不可中断。路径的长度是指关系的数量,固定长度的路径是指:路径中关系的数量是固定不变的,可变长度的路径是:指路径中关系的数量是可变的。关系的数量有两种表示方式:固定长度和变长。

    • 固定长度的关系,使用[* n]来表示
    • 变长的关系,使用[*start..end]来表示,其中 .. 表示关系的长度是可变的,start表示关系数量的最小值,end表示关系数量的最大值。

    注:start和end都可以省略,如果省略start,那么关系的长度 <= end;如果省略end,那么关系的长度>=start;如果同时省略start和end,那么关系的长度是任意的。

    在变长关系模式中,也可以指定关系的类型:[Type * start .. end ],变长关系只能用于MATCH查询语句中,不能用于CREATE和MERGE语句中。

    1,固定长度的关系

    在关系[]中,使用*2表示关系的长度为2,使用该模式来表示路径,路径两端的节点是a和b,路径中间的节点是匿名的,无法通过变量来引用。

    (a)-[*2]->(b)
    

    该模式描述了3个节点和2个关系,路径两端的节点是a和b,中间节点是匿名节点,等价于以下的模式:

    (a)-->()-->(b)
    

    2,变长关系

    在关系[]中,使用[*start .. end]来表示变长关系

    (a)-[*3..5]->(b)
    (a)-[*3..]->(b)
    (a)-[*..5]->(b)
    (a)-[*]->(b)
    

    3,路径变量

    Cypher允许对Path命名,把Path赋值给变量p,路径模式可以使用p来表示:

    p = (a)-[*3..5]->(b)
    

    4,举个例子

    有如下的有向图数据,按照有向图来计算路径,最长的路径长度是2;按照无向图来计算路径,最长的路径长度是6。

    img

    分析以下Cypher查询,在路径模式中,路径是无向的,路径的长度是1或2,关系的类型是KNOWS,节点Filipa和节点remote_friend在同一条路径中,

    MATCH (me)-[:KNOWS*1..2]-(remote_friend)
    WHERE me.name = 'Filipa'
    RETURN remote_friend.name
    

    转载于:https://www.cnblogs.com/ljhdo/p/10913917.html

  • 相关阅读:
    小波变换的引入,通俗易懂
    Leetcode 437. Path Sum III
    Leetcode 113. Path Sum II
    Leetcode 112 Path Sum
    Leetcode 520 Detect Capital
    Leetcode 443 String Compression
    Leetcode 38 Count and Say
    python中的生成器(generator)总结
    python的random模块及加权随机算法的python实现
    leetcode 24. Swap Nodes in Pairs(链表)
  • 原文地址:https://www.cnblogs.com/weijiqian/p/14840794.html
Copyright © 2011-2022 走看看