| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> 人工智能 -> 图数据库(neo4j)学习心得 -> 正文阅读 |
|
[人工智能]图数据库(neo4j)学习心得 |
图数据库(neo4j)学习心得什么是图?? 图由两个元素组成:节点、关系 图数据库常用领域社交网络Facebook, Twitter,Linkedin用它来管理社交关系,实现好友推荐 推荐和个性化eBay,沃尔玛使用它实现商品实时推荐,给买家更好的购物体验 欺诈识别例如银行欺诈,信用卡欺诈,电子商务欺诈,保险欺诈等 金融领域摩根大通,花旗和瑞银等银行在用图数据库做风控处理 汽车制造领域沃尔沃,戴姆勒和丰田等顶级汽车制造商依靠图数据库推动创新制造解决方案 电信领域Verizon, Orange和AT&T 等电信公司依靠图数据库来管理网络 图数据库的种类数据库评分排行网站DB-Engines的评分截图图下: Neo4j相关特性 Neo4j被称为property graph,除了顶点(Node)和边(Relationship,其包含一个类型),还有一种重要的部分——属性。无论是顶点还是边,都可以有任意多的属性。属性的存放类似于一个hashmap,key为一个字符串,而value必须是Java基本类型、或者是基本类型数组,比如说String、int或者int[]都是合法的。 索引 Neo4j支持索引,其内部实际上通过Lucene实现。 遍历是图数据库中的主要查询方式,所以遍历是图数据中相当关键的一个概念。可以用两种方式来进行遍历查询:第一种是直接编写Java代码,使用Neo4j提供的traversal框架;第二种方式是使用Neo4j提供的描述型查询语言,Cypher。 图算法 Neo4j实现的三种图算法:最短路径(最少数目的关系)、Dijkstra算法(解决有向图中任意两个顶点之间的最短路径问题)以及A*算法(是解决静态路网中求解最短路最有效的方法)。 嵌入式可扩展 Neo4j是一个嵌入式,基于磁盘的,支持完整事务的Java持久化引擎,它在图像中而不是表中存储数据。Neo4j提供了大规模可扩展性,在一台机器上可以处理数十亿节点、关系、属性的图像,可以扩展到多台机器并行运行。相对于关系数据库来说,图形数据库善于处理大量复杂、互连接、低结构化的数据,这些数据变化迅速,需要频繁的查询——在关系数据库中,这些查询会导致大量的表连接,因此会产生性能上的问题。Neo4j重点解决了拥有大量连接的传统RDBMS在查询时出现的性能衰退问题。通过围绕图形进行数据建模,Neo4j会以相同的速度遍历节点与边,其遍历速度与构成图形的数据量没有任何关系。 Neo4j集群模式运行原理 当一个Neo4j HA实体开启时将去连接协调器服务(zookeeper)注册其本身并询问“谁是主机(master)?”。如果某个机器是主机,新的实体将以从机(slaver)开启并连接到主机(master)。如果机器开启时为第一个注册或者通过主机选择算法应该成为主机,将会作为主机开启。 ? 当从一个从机上执行一个写入的事务时,每个写入操作将与主机同步(主机与从机将被锁定)。当事务提交时首先存在于主机上。当主机事务提交成功,从机上的事务也会被提交。为确保一致性,在执行写入操作前从机与主机同步必须是最新的。这是建立主机与从机之间的通讯协议,所以如果需要,更新将会自动发生。 ? 可以通过在包含ha.slave_coordinator_update_mode=none配置参数的配置文件中将数据库实体设置成只做为从机。此实体虽然在系统故障恢复选择时将不可能再成为主机,然而此从机的行为与其他所有从机都一样,含有永久写入到主机的能力。 ? 当从主机上执行写入操作,它将与在普通的嵌入模式中执行一样。此时主机将不会推送更新消息到从机。相反,从机可以配置一个拉取消息的时间间隔。没有选举,更新操作仅仅只会发生在从机上,任何时候都将同步一个写入到主机。 ? 将所有写入操作通过从机执行的好处是数据将被复制到两台机器上。这是建议的,避免当新选主机时可能造成回滚失败。 ? 当某台neo4j数据库服务不可用时,协调器(coordinator)将探测到并从集群中删除掉。当主机当机时,新的主机将自动被选择出来。一般地,一个新的主机被选定并在几秒钟内启动,在这段时间将不会执行任何写入操作(写入将抛出异常)。当某台机器从故障中恢复了,将会被自动重新连接到集群中。当没有得到其他任何机器的备份的旧的主机改变时, 是唯一不确定的。如果新的主机被选择并在旧的主机恢复前执行改变,将会有两个不同版本的数据。旧主机将移除分支数据库并从新主机下载一个全版本的数据。 ? 所有这些可以归纳如下: ? 从机可以处理写入事务。 ? 更新相对从机最终将会一致。 ? Neo4j HA 是一个容错并能继续执行从x台机器到单独一台机器(基于zookeeper设置)。 ? 在写入操作上从机将自动同步到主机。 ? 当主机故障时新的主机将自动选出。 ? 当任何导致运行中断的错误(网络、维护)解决时当台机器将会自动被重新连接到集群中。 ? 事务的原子性、持久性和一致性并最终会广播到其他从机上。 ? 主机故障了,所有正在运行写入事务将会被回滚,主机选举时任何写入操作都不能执行。 ? 读取操作高度可用。 Neo4j优缺点 数据的插入,查询操作很直观,不用再像之前要考虑各个表之间的关系。 提供的图搜索和图遍历方法很方便,速度也是比较快的。 更快的数据库操作。当然,有一个前提条件,那就是数据量较大,在MySql中存储的话需要许多表,并且表之间联系较多(即有不少的操作需要join表)。 缺点: 当数据过大时插入速度可能会越来越慢。. 超大节点。当有一个节点的边非常多时(常见于大V),有关这个节点的操作的速度将大大下降。这个问题很早就有了,官方也说过会处理,然而现在仍然不能让人满意。 提高数据库速度的常用方法就是多分配内存,然而看了官方操作手册,貌似无法直接设置数据库内存占用量,而是需要计算后为其”预留“内存… 注:鉴于其明显的优缺点,Neo4j适合存储”修改较少,查询较多,没有超大节点“的图数据。 Neo4j常见问题 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:返回所需要的。 操作符 数学操作符有+,-,*,/和%。当然只有+对字符有作用。 等于操作符有=,<>,<,>,<=,>=。 因为Neo4j是一个模式少的图形数据库,Cypher有两个特殊的操作符?和!。 有些是用在属性上,有些事用于处理缺少值。对于一个不存在的属性做比较会导致错误。为替代与其他什么做比较时总是检查属性是否存在,在缺失属性时问号将使得比较总是返回true,感叹号使得比较总是返回false。 WHEREn.prop? = “foo” 这个断言在属性缺失情况下将评估为true。 WHEREn.prop! = “foo” 这个断言在属性缺失情况下将评估为false。 警告:在同一个比较中混合使用两个符号将导致不可预料的结果。 参数 参数可以在where子句,start子句的索引key或索引值,索引查询中作为节点/关系id的引用。 以下是几个在java中使用参数的示例: 节点id参数 Map<String, Object> params = new HashMap<String, Object>(); params.put( “id”, 0 ); ExecutionResult result = engine.execute( “start n=node({id}) return n.name”, params ); 节点对象参数 Map<String, Object> params = new HashMap<String, Object>(); params.put( “node”, andreasNode ); ExecutionResult result = engine.execute( “start n=node({node}) return n.name”, params ); 多节点id参数 Map<String, Object> params = new HashMap<String, Object>(); params.put( “id”, Arrays.asList( 0, 1, 2 ) ); ExecutionResult result = engine.execute( “start n=node({id}) return n.name”, params ); 字符串参数 Map<String, Object> params = new HashMap<String, Object>(); params.put( “name”, “Johan” ); ExecutionResult result = engine.execute( “start n=node(0,1,2) where n.name = {name} return n”, params ); 索引键值参数 Map<String, Object> params = new HashMap<String, Object>(); params.put( “key”, “name” ); params.put( “value”, “Michaela” ); ExecutionResult result = engine.execute( “start n=node:people({key} = {value}) return n”, params ); 索引查询参数 Map<String, Object> params = new HashMap<String, Object>(); params.put( “query”, “name:Andreas” ); ExecutionResult result = engine.execute( “start n=node:people({query}) return n”, params ); l SKIP 与LIMIT * 的数字参数 Map<String, Object> params = new HashMap<String, Object>(); params.put( “s”, 1 ); params.put( “l”, 1 ); ExecutionResult result = engine.execute( “start n=node(0,1,2) return n.name skip {s} limit {l}”, params ); l 正则表达式参数 Map<String, Object> params = new HashMap<String, Object>(); params.put( “regex”, “.h.” ); ExecutionResult result = engine.execute( “start n=node(0,1,2) where n.name =~ {regex} return n.name”, params ); 标识符 如下例中: START n=node(1) MATCH n–>b RETURN b 标识符为n和b。 标识符可以是大写或小些,可以包含下划线。当需要其他字符时可以使用符号。对于属性名的规则也是一样。 注解 START n=node(1) RETURN b //这是行结束注释 START n=node(1) RETURN b START n=node(1) WHERE n.property = “//这部是一个注释” RETURN b Start 在这里插入图片描述 通过id绑定点 通过node(*)函数绑定一个节点作为开始点 查询: START n=node(1) RETURN n 返回引用的节点。 通过id绑定关系 可以通过relationship()函数绑定一个关系作为开始点。也可以通过缩写rel()。 查询: START r=relationship(0) RETURN r Id为0的关系将被返回 通过id绑定多个节点 选择多个节点可以通过逗号分开。 查询: START n=node(1, 2, 3) RETURN n 所有节点 得到所有节点可以通过星号(*),同样对于关系也适用。 查询: START n=node(*) RETURN n 这个查询将返回图中所有节点。 通过索引查询获取节点 如果开始节点可以通过索引查询得到,可以如此来写: node:index-name(key=”value”)。在此列子中存在一个节点索引叫nodes。 查询: START n=node:nodes(name = “A”) RETURN n 索引中命名为A的节点将被返回。 通过索引查询获取关系 如果开始点可以通过索引查询得到,可以如此做: Relationship:index-name(key=”value”)。 查询: START r=relationship:rels(property =“some_value”) RETURN r 索引中属性名为”some_value”的关系将被返回。 多个开始点 有时需要绑定多个开始点。只需要列出并以逗号分隔开。 查询: START a=node(1), b=node(2) RETURN a,b A和B两个节点都将被返回。 Match 节点标识符可以使用或者不是用圆括号。使用圆括号与不使用圆括号完全对等,如: MATCH(a)–>(b) 与 MATCH a–>b 匹配模式完全相同。 模式的所有部分都直接或者间接地绑定到开始点上。可选关系是一个可选描述模式的方法,但在真正图中可能没有匹配(节点可能没有或者没有此类关系时),将被估值为null。与SQL中的外联结类似,如果Cypher发现一个或者多个匹配,将会全部返回。如果没有匹配,Cypher将返回null。 如以下例子,b和p都是可选的病都可能包含null: START a=node(1) MATCH p = a-[?]->b START a=node(1) MATCH p = a-[*?]->b START a=node(1) MATCH p = a-[?]->x–>b START a=node(1), x=node(100) MATCH p = shortestPath( a-[*?]->x ) 相关节点 符号—意味着相关性,不需要关心方向和类型。 查询: START n=node(3) MATCH (n)–(x) RETURN x 所有与A相关节点都被返回。 接出关系(Outgong relationship) 当对关系的方向感兴趣时,可以使用–>或<–符号,如: 查询: START n=node(3) MATCH (n)–>(x) RETURN x 所有A的接出关系到达的节点将被返回. 定向关系和标识符 如果需要关系的标识符,为了过滤关系的属性或为了返回关系,可如下例使用标识符。 查询: START n=node(3) MATCH (n)-[r]->() RETURN r 所有从节点A接出的关系将被返回。 通过关系类型匹配 当已知关系类型并想通过关系类型匹配时,可以通过冒号详细描述。 查询: START n=node(3) MATCH (n)-[:BLOCKS]->(x) RETURN x 返回A接出关系类型为BLOCKS的节点。 通过关系类型匹配和使用标识符 如果既想获得关系又要通过已知的关系类型,那就都添加上,如: 查询: START n=node(3) MATCH (n)-[r:BLOCKS]->() RETURN r 所有从A接出的关系为BLOCKS的关系都被返回。 带有特殊字符的关系类型 有时候数据库中有非字母字符类型,或有空格在内时,使用单引号。 查询: START n=node(3) MATCH (n)-[r:TYPE WITH SPACE IN IT]->() RETURN r 返回类型有空格的关系。 多重关系 关系可以通过使用在()—()多个语句来表达,或可以串在一起。如下: 查询: START a=node(3) MATCH (a)-[:KNOWS]->(b)-[:KNOWS]->? RETURN a,b,c 路径中的三个节点。 可变长度的关系 可变数量的关系->节点可以使用-[:TYPE*minHops…maxHops]->。 查询: START a=node(3), x=node(2, 4) MATCH a-[:KNOWS*1…3]->x RETURN a,x 如果在1到3的关系中存在路径,将返回开始点和结束点。 在可变长度关系的关系标识符 当连接两个节点的长度是可变的不确定的时,可以使用一个关系标识符遍历所有关系。 查询: START a=node(3), x=node(2, 4) MATCH a-[r:KNOWS*1…3]->x RETURN r 如果在1到3的关系中存在路径,将返回开始点和结束点。 零长度路径 当使用可变长度路径,可能其路径长度为0,这也就是说两个标识符指向的为同一个节点。如果两点间的距离为0,可以确定这是同一个节点。 查询: START a=node(3) MATCH p1=a-[:KNOWS0…1]->b, p2=b-[:BLOCKS0…1]->c RETURN a,b,c, length(p1), length(p2) 这个查询将返回四个路径,其中有些路径长度为0. 可选关系 如果关系为可选的,可以使用问号表示。与SQL的外连接类似。如果关系存在,将被返回。如果不存在在其位置将以null代替。 查询: START a=node(2) MATCH a-[?]->x RETURN a,x 返回一个节点和一个null,因为这个节点没有关系。 可选类型和命名关系 通过一个正常的关系,可以决定哪个标识符可以进入,那些关系类型是需要的。 查询: START a=node(3) MATCH a-[r?:LOVES]->() RETURN a,r 返回一个节点和一个null,因为这个节点没有关系。 可选元素的属性 返回可选元素上的属性,null值将返回null。 查询: START a=node(2) MATCH a-[?]->x RETURN x, x.name 元素x在查询中为null,所有其属性name为null。 复杂匹配 在Cypher中,可哟通过更多复杂模式来匹配,像一个钻石形状模式。 查询: START a=node(3) MATCH (a)-[:KNOWS]->(b)-[:KNOWS]->?,(a)-[:BLOCKS]-(d)-[:KNOWS]-? RETURN a,b,c,d 路径中的四个节点。 最短路径 使用shortestPath函数可以找出一条两个节点间的最短路径,如下。 查询: START d=node(1), e=node(2) MATCH p = shortestPath( d-[*…15]->e ) RETURN p 这意味着:找出两点间的一条最短路径,最大关系长度为15.圆括号内是一个简单的路径连接,开始节点,连接关系和结束节点。关系的字符描述像关系类型,最大数和方向在寻找最短路径中都将被用到。也可以标识路径为可选。 所有最但路径 找出两节点节点所有的最短路径。 查询: START d=node(1), e=node(2) MATCH p = allShortestPaths( d-[*…15]->e ) RETURN p 这将在节点d与e中找到两条有方向的路径。 命名路径 如果想在模式图上的路径进行过滤或者返回此路径,可以使用命名路径(named path)。 查询: START a=node(3) MATCH p = a–>b RETURN p 开始节点的两个路径。 在绑定关系上的匹配 当模式中包含一个绑定关系时,此关系模式没有明确的方向,Cypher将尝试着切换连接节点的边匹配关系。 查询: START a=node(3), b=node(2) MATCH a-[?:KNOWS]-x-[?:KNOWS]-b RETURN x 将返回两个连接节点,一次为开始节点,一次为结束节点。 Where Boolean 操作类型 可以使用boolean操作符and 和 or 或者也可以使用not()函数。 查询: START n=node(3, 1) WHERE (n.age < 30 and n.name = “Tobias”) ornot(n.name = “Tobias”) RETURN n 返回节点。 节点属性上的过滤 查询: START n=node(3, 1) WHERE n.age < 30 RETURN n 正则表达式 可以通过使用=~ /regexp/来匹配正在表达式。如下: 查询: START n=node(3, 1) WHERE n.name =~ /Tob.*/ RETURN n 返回名叫Tobias的节点。 转义正则表达式 如果在正则表达式中需要有斜杠时可以通过转义实现。 查询: START n=node(3, 1) WHERE n.name =~ /Some/thing/ RETURN n 没有匹配的节点返回。 不分大小些正则表达式 在正则表达式前加上?i,整个正则表达式将会忽略大小写。 查询: START n=node(3, 1) WHERE n.name =~ /(?i)ANDR.*/ RETURN n 属性name为Andres的节点将返回 关系类型上的过滤 可以match模式中通过添加具体的关系类型,但有时需要针对类型的更加高级的过滤。可以使用明确的type属性来对比,查询对关系类型名作一个正则比较。 查询: START n=node(3) MATCH (n)-[r]->() WHERE type? =~ /K.*/ RETURN r 关系整个以K开始的类型名都将返回。 属性存在性 查询: START n=node(3, 1) WHERE n.belt RETURN n 如果缺失属性默认为true 仅当属性存在时,比较一个图的元素的此属性,使用允许空属性的语法。 查询: START n=node(3, 1) WHERE n.belt? = ‘white’ RETURN n 所有节点即使没有belt属性的 都将返回。此类比较返回为true。 如果缺失属性默认为false 需要在缺失属性时为false,即不想返回此属性不存在的节点时。使用感叹号。 查询: START n=node(3, 1) WHERE n.belt! = ‘white’ RETURN n 空置null过滤 有时候需要测试值或者标识符是否为null。与sql类似使用 is null 或 not(is null x)也能起作用。 查询: START a=node(1), b=node(3, 2) MATCH a<-[r?]-b WHERE r is null RETURN b Tobias节点没有链接上。 关系过滤 为过滤两点间基于关系的子图,在match子句中使用限制部分。可以描述带方向的关系和可能的类型。这些都是有效的表达:WHERE a-→b WHERE a←-b WHERE a←[:KNOWS]-bWHERE a-[:KNOWS]-b 查询: START a=node(1), b=node(3, 2) WHERE a<–b RETURN b Tobias节点没有链接 neo4j 综合 查询中的返回部分,返回途中定义的感兴趣的部分。可以为节点、关系或其上的属性。 返回节点 返回一个节点,在返回语句中列出即可。 查询: START n=node(2) RETURN n 返回关系 查询: START n=node(1) MATCH (n)-[r:KNOWS]->? RETURN r 返回属性 查询: START n=node(1) RETURN n.name 带特殊字符的标识符 使用不在英语字符表中的字符,可以使用’单引号。 查询: START This isn’t a commonidentifier=node(1) RETURN This isn’t a commonidentifier.<<!!__??>>` 列的别名 可以给展示出来的列名起别名。 查询: START a=node(1) RETURN a.age AS SomethingTotallyDifferent 返回节点的age属性,但重命名列名。 可选属性 属性在节点上可能存在也可能不存在,可以使用问号来标识标识符即可。 查询: START n=node(1, 2) RETURN n.age? 如果存在age属性,则返回,不存在则返回null。 特别的结果 DISTINCT 仅检索特别的行,基于选择输出的列。 查询: START a=node(1) MATCH (a)–>(b) RETURN distinct b 返回name为B的节点,但仅为一次。 neo4j 聚合函数 为集合计算数据,Cypher提供聚类功能,与SQL的group by类似。在return语句中发现的任何聚类函数,所有没有聚类函数的列将作为聚合key使用。图: [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-twepaXSm-1582473468294)(file:///C:/Users/User/AppData/Local/Temp/msohtmlclip1/01/clip_image114.jpg)] 计数 计数(count)使用来计算行数。Count有两种使用方法。Count(*)计算匹配的行的行数,count(<标识符>)计算标识符中非空值数。 计算节点数 计算链接到一个节点的节点数,可以使用count(*)。 查询: START n=node(2) MATCH (n)–>(x) RETURN n, count(*) 返回开始节点和相关节点节点数。 分组计算关系类型 计算分组了得关系类型,返回关系类型并使用count(*)计算。 查询: START n=node(2) MATCH (n)-[r]->() RETURN type?, count(*) 返回关系类型和其分组数。 计算实体数 相比使用count(*),可能计算标识符更实在。 查询: START n=node(2) MATCH (n)–>(x) RETURN count(x) 返回链接到开始节点上的节点数 计算非空可以值数 查询: START n=node(2,3,4,1) RETURN count(n.property?) 求和(sum) Sum集合简单计算数值类型的值。Null值将自动去掉。如下: 查询: START n=node(2,3,4) RETURN sum(n.property) 计算所有节点属性值之和。 平均值(avg) Avg计算数量列的平均值 查询: START n=node(2,3,4) RETURN avg(n.property) 最大值(max) Max查找数字列中的最大值。 查询: START n=node(2,3,4) RETURN max(n.property) 最小值(min) Min使用数字属性作为输入,并返回在列中最小的值。 查询: START n=node(2,3,4) RETURN min(n.property) 聚类(COLLECT) Collect将所有值收集到一个集合list中。 查询: START n=node(2,3,4) RETURN collect(n.property) 返回一个带有所有属性值的简单列。 相异(DISTINCT) 聚合函数中使用distinct来去掉值中重复的数据。 查询: START a=node(2) MATCH a–>b RETURN count(distinct b.eyes) neo4j 高级篇 输出结果排序可以使用order by 子句。注意,不能使用节点或者关系排序,仅仅只针对其属性有效。 通过节点属性排序节点 查询: START n=node(3,1,2) RETURN n ORDER BY n.name 通过多节点属性排序节点 在order by子句中可以通过多个属性来排序每个标识符。Cypher首先将通过第一个标识符排序,如果第一个标识符或属性相等,则在order by中检查下一个属性,依次类推。 查询: START n=node(3,1,2) RETURN n ORDER BY n.age, n.name 首先通过age排序,然后再通过name排序。 倒序排列节点 可以在标识符后添加desc或asc来进行倒序排列或顺序排列。 查询: START n=node(3,1,2) RETURN n ORDER BY n.name DESC 空值排序 当排列结果集时,在顺序排列中null将永远放在最后,而在倒序排列中放最前面。 查询: START n=node(3,1,2) RETURN n.length?, n ORDER BY n.length? Skip Skip允许返回总结果集中的一个子集。此不保证排序,除非使用了order by’子句。 跳过前三个 返回结果中一个子集,从第三个结果开始,语法如下: 查询: START n=node(3, 4, 5, 1, 2) RETURN n ORDER BY n.name SKIP 3 前三个节点将略过,最后两个节点将被返回。 返回中间两个 查询: START n=node(3, 4, 5, 1, 2) RETURN n ORDER BY n.name SKIP 1 LIMIT 2 中间两个节点将被返回。 Limit Limit允许返回结果集中的一个子集。 查询: START n=node(3, 4, 5, 1, 2) RETURN n LIMIT 3 函数(Functions) 在Cypher中有一组函数,可分为三类不同类型:判断、标量函数和聚类函数。 判断 判断为boolean函数,对给出的输入集合做判断并返回true或者false。常用在where子句中过滤子集。 All 迭代测试集合中所有元素的判断。 语法: All(标识符 in iterable where 判断) 参数: ? iterable :一个集合属性,或者可迭代的元素,或一个迭代函数。 ? 标识符:可用于判断比较的标识符。 ? 判断:一个测试所有迭代器中元素的判断。 查询: START a=node(3), b=node(1) MATCH p=a-[*1…3]->b WHERE all(x in nodes§ WHERE x.age > 30) RETURN p 过滤包含age〈30的节点的路径,返回符合条件路径中所有节点。 Any 语法:ANY(identifierin iterable WHERE predicate) 参数: ? Iterable(迭代器):一个集合属性,或者可迭代的元素,或一个迭代函数。 ? Identifier(标识符):可用于判断比较的标识符。 ? Predicate(判断):一个测试所有迭代器中元素的判断。 查询: START a=node(2) WHERE any(x in a.array WHERE x = “one”) RETURN a None 在迭代器中没有元素判断将返回true。 语法:NONE(identifierin iterable WHERE predicate) ? Iterable(迭代器):一个集合属性,或者可迭代的元素,或一个迭代函数。 ? Identifier(标识符):可用于判断比较的标识符。 ? Predicate(判断):一个测试所有迭代器中元素的判断。 查询: START n=node(3) MATCH p=n-[*1…3]->b WHERE NONE(x in nodes§ WHERE x.age = 25) RETURN p Single 如果迭代器中仅有一个元素则返回true。 语法:SINGLE(identifierin iterable WHERE predicate) 参数: ? Iterable(迭代器):一个集合属性,或者可迭代的元素,或一个迭代函数。 ? Identifier(标识符):可用于判断比较的标识符。 ? Predicate(判断):一个测试所有迭代器中元素的判断。 查询: START n=node(3) MATCH p=n–>b WHERE SINGLE(var in nodes§ WHERE var.eyes = “blue”) RETURN p Scalar函数 标量函数返回单个值。 Length 使用详细的length属性,返回或过滤路径的长度。 语法:LENGTH(iterable ) 参数: ? Iterable(迭代器):一个集合属性,或者可迭代的元素,或一个迭代函数。 查询: START a=node(3) MATCH p=a–>b–>c RETURN length§ 返回路径的长度。 Type 返回关系类型的字符串值。 语法:TYPE(relationship ) 参数: ? Relationship:一条关系。 查询: START n=node(3) MATCH (n)-[r]->() RETURN type? 返回关系r的类型。 Id 返回关系或者节点的id 语法:ID(property-container ) 参数: ? Property-container:一个节点或者一条关系。 查询: START a=node(3, 4, 5) RETURN ID(a) 返回这三个节点的id。 Coalesce 返回表达式中第一个非空值。 语法:COALESCE(expression [, expression]* ) 参数: ? Expression:可能返回null的表达式。 查询: START a=node(3) RETURN coalesce(a.hairColour?,a.eyes?) Iterable函数 迭代器函数返回一个事物的迭代器—在路径中的节点等等。 Nodes 返回一个路径中的所有节点。 语法:NODES(path ) 参数: ? Path:路径 查询: START a=node(3), c=node(2) MATCH p=a–>b–>c RETURN NODES§ Relationships 返回一条路径中的所有关系。 语法:RELATIONSHIPS(path ) 参数: ? Path:路径 查询: START a=node(3), c=node(2) MATCH p=a–>b–>c RETURN RELATIONSHIPS§ Extract 可以使用extract单个属性,或从关系或节点集合迭代一个函数的值。将遍历迭代器中所有的节点并运行表达式返回结果。 语法:EXTRACT(identifier in iterable : expression ) ? Iterable(迭代器):一个集合属性,或者可迭代的元素,或一个迭代函数。 ? Identifier(标识符):闭包中表述内容的标识符,这决定哪个标识符将用到。 ? expression(表达式):这个表达式将对于迭代器中每个值运行一次,并生成一个结果迭代器。 查询: START a=node(3), b=node(4),c=node(1) MATCH p=a–>b–>c RETURN extract(n in nodes§ : n.age) 返回路径中所有age属性值。 链接: Neo4j详解 . |
|
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/26 15:32:24- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |