neo4j查询语言Cypher详解(二)--Pattern和类型

news2024/11/29 12:38:48

Patterns

图形模式匹配是Cypher的核心。它是一种用于通过应用声明性模式从图中导航、描述和提取数据的机制。在MATCH子句中,可以使用图模式定义要搜索的数据和要返回的数据。图模式匹配也可以在不使用MATCH子句的情况下在EXISTS、COUNT和COLLECT子查询中使用。

图模式使用类似于在白板上绘制属性图的节点和关系的语法来描述数据。在白板上,节点绘制为圆圈,关系绘制为箭头。Cypher将圆圈表示为一对括号,箭头表示为破折号和大于或小于符号: ()-->()<--()

这些节点和关系的简单模式构成了路径模式的构建块,可以匹配固定长度的路径。除了讨论简单的模式外,本章还将介绍更复杂的模式,展示如何匹配可变长度的模式,内联过滤器以提高查询性能,以及如何向路径模式添加循环非线性形状。

概念

Node patterns

每个图模式至少包含一个节点模式。最简单的图形模式是单个空节点模式: MATCH ()

空节点模式匹配属性图中的每个节点。为了获得对匹配节点的引用,需要在node模式中声明一个变量: MATCH (n)

通过这个变量引用,可以访问节点:MATCH (n) RETURN n.name

向节点模式添加Label表达式意味着只返回具有匹配标签的节点。MATCH (n:Stop)

更复杂模式:MATCH (n:(TrainStation&BusStation)|StationGroup)

属性名称和值的映射可用于基于与指定值的相等性来匹配节点属性。MATCH (n { mode: 'Rail' })

更一般的谓词可以用WHERE子句表示。MATCH (n:Station WHERE n.name STARTS WITH 'Preston')

Relationship patterns

最简单的关系模式: --。此模式匹配任何方向的关系,并且不过滤任何关系类型或属性。与节点模式不同,关系模式不能在两端没有节点模式的MATCH子句中使用。

为了获得对模式匹配的关系的引用,需要在模式中声明一个关系变量,方法是在破折号之间的方括号中添加变量名:-[r]-

为了匹配特定的方向,在左侧或右侧分别加上<>: -[r]->

若要匹配关系类型,在冒号后添加类型名称: -[:CALLS_AT]->

与节点模式类似,可以添加属性名称和值的映射,以基于与指定值的相等性来过滤关系的属性: -[{ distance: 0.24, duration: 'PT4M' }]->WHERE子句可以用于更一般的谓词: -[r WHERE time() + duration(r.duration) < time('22:00') ]->

Path patterns

任何有效的路径都以一个节点开始和结束,每个节点之间都有关系(如果有多个节点)。路径模式具有相同的限制,对于所有有效的路径模式,以下条件为真:

  • 它们至少有一个节点模式。

  • 它们以节点模式开始和结束。

  • 它们在节点和关系之间交替。

这些都是有效的路径模式:

()
(s)--(e)
(:Station)--()<--(m WHERE m.departs > time('12:00'))-->()-[:NEXT]->(n)

无效路径模式:

-->					//无节点
()-->				//尾部没有节点
()-->-->()			//节点和关系之间无交替

路径模式匹配

Equijoins

等量连接是一种对路径的操作,它要求多个节点或路径之间的关系相同。通过在多个节点模式或关系模式中声明相同的变量来指定节点或关系之间的相等性。等量连接允许在路径模式中指定循环

MATCH (n:Station {name: 'London Euston'})<-[:CALLS_AT]-(s1:Stop)
  -[:NEXT]->(s2:Stop)-[:CALLS_AT]->(:Station {name: 'Coventry'})
  <-[:CALLS_AT]-(s3:Stop)-[:NEXT]->(s4:Stop)-[:CALLS_AT]->(n)
RETURN s1.departs+'-'+s2.departs AS outbound,
  s3.departs+'-'+s4.departs AS `return`

量化路径模式

通过使用量化路径模式来匹配不同长度的路径,从而允许您搜索长度未知或在特定范围内的路径。

在搜索可从锚节点到达的所有节点、查找连接两个节点的所有路径,或者遍历可能具有不同深度的层次结构时,量化路径模式可能非常有用。

量化路径模式通过将路径模式的重复部分提取到括号中并应用量词来解决此问题。该量词指定要匹配的提取模式的可能重复范围。第一步是识别重复模式

((:Stop)-[:NEXT]->(:Stop)){1,3}
(:Stop)-[:NEXT]->(:Stop) |
(:Stop)-[:NEXT]->(:Stop)(:Stop)-[:NEXT]->(:Stop) |
(:Stop)-[:NEXT]->(:Stop)(:Stop)-[:NEXT]->(:Stop)(:Stop)-[:NEXT]->(:Stop)

这里的联合运算符(|)仅用于说明;以这种方式使用它不是Cypher语法的一部分。在上面的扩展中,如果两个节点模式彼此相邻,它们必须匹配相同的节点:服务的下一个部分从上一个部分结束的地方开始。因此,它们可以被重写为具有任何过滤条件组合的单节点模式。在本例中,这是微不足道的,因为应用于这些节点的过滤只是标签Stop:

MATCH (:Station { name: 'Denmark Hill' })<-[:CALLS_AT]-(d:Stop)
      ((:Stop)-[:NEXT]->(:Stop)){1,3}
      (a:Stop)-[:CALLS_AT]->(:Station { name: 'Clapham Junction' })
RETURN d.departs AS departureTime, a.arrives AS arrivalTime

量化关系

量化关系允许以更简洁的方式重写一些简单的量化路径模式。

MATCH (d:Station { name: 'Denmark Hill' })<-[:CALLS_AT]-(n:Stop)
      ((:Stop)-[:NEXT]->(:Stop)){1,10}
      (m:Stop)-[:CALLS_AT]->(a:Station { name: 'Clapham Junction' })
WHERE m.arrives < time('17:18')
RETURN n.departs AS departureTime
                       
                       
MATCH (d:Station { name: 'Denmark Hill' })<-[:CALLS_AT]-
        (n:Stop)-[:NEXT]->{1,10}(m:Stop)-[:CALLS_AT]->
        (a:Station { name: 'Clapham Junction' })
WHERE m.arrives < time('17:18')
RETURN n.departs AS departureTime

量词{1,10}的作用域是关系模式-[:NEXT]->,而不是与之相邻的节点模式。更一般地说,其中量化路径模式中包含的路径模式具有以下形式:

(() <relationship pattern> ()) <quantifier>
//可以简化为
<relationship pattern> <quantifier>

Group variables

顾名思义,这个属性表示两个站点之间的距离。为了返回连接一对station的每个服务的总距离,需要一个变量来引用所遍历的每个关系。类似地,要提取每个Stop的出发地和到达地属性,需要引用遍历的每个节点的变量。在这个在Denmark Hill和Clapham Junction之间匹配服务的示例中,变量l和m被声明为匹配stop, r被声明为匹配关系。变量origin只匹配路径中的第一个Stop:

MATCH (:Station { name: 'Denmark Hill' })<-[:CALLS_AT]-(origin)
      ((l)-[r:NEXT]->(m)){1,3}
      ()-[:CALLS_AT]->(:Station { name: 'Clapham Junction' })
      

在量化路径模式中声明的变量称为组变量。之所以这样称呼它们,是因为当在量化路径模式之外引用时,它们是匹配中绑定到的节点或关系的列表。要理解如何考虑组变量绑定到节点或关系的方式,可以扩展量化路径模式,并观察不同变量如何匹配到整体匹配路径的元素。

(l1)-[r1:NEXT]->(m1) |
(l1)-[r1:NEXT]->(m1)(l2)-[r2:NEXT]->(m2) |
(l1)-[r1:NEXT]->(m1)(l2)-[r2:NEXT]->(m2)(l3)-[r3:NEXT]->(m3)

每个变量的下标表示它们属于路径模式重复的哪个实例。

l => [n2, n3, n4]
r => [r2, r3, r4]
m => [n3, n4, n5]

最短路径

MATCH p = shortestPath((hby)-[:LINK*]-(cnm))
WHERE hby.name = 'Hartlebury' AND cnm.name = 'Cheltenham Spa'
RETURN [n in nodes(p) | n.name] AS stops
        
MATCH p = shortestPath((hby)-[:LINK*]-(cnm))
WHERE all(link in relationships(p) WHERE link.distance < 20) AND
      hby.name = 'Hartlebury' AND cnm.name = 'Cheltenham Spa'
RETURN [n in nodes(p) | n.name] AS stops
        
MATCH p = allShortestPaths((hby)-[link:LINK*]-(psh))
WHERE hby.name = 'Hartlebury' AND psh.name = 'Pershore'
RETURN [n in nodes(p) | n.name] AS stops

量化路径模式断言

primer

语法和语义

//节点模式
nodePattern ::= "(" [ nodeVariable ] [ labelExpression ]
    [ propertyKeyValueExpression ] [ "WHERE" booleanExpression ] ")"
    
//关系模式    
relationshipPattern ::= fullPattern | abbreviatedRelationship

fullPattern ::=
    "<-[" patternFiller "]-"
  | "-[" patternFiller "]->"
  | "-[" patternFiller "]-"

abbreviatedRelationship ::= "<--" | "--" | "-->"

patternFiller ::= [ relationshipVariable ] [ typeExpression ]
    [ propertyKeyValueExpression ] [ "WHERE" booleanExpression ]
    
//Lable 表达式
labelExpression ::= ":" labelTerm
//
labelTerm ::=
    labelIdentifier
  | labelTerm "&" labelTerm
  | labelTerm "|" labelTerm
  | "!" labelTerm
  | "%"
  | "(" labelTerm ")"
//
propertyKeyValueExpression ::=
  "{" propertyKeyValuePairList "}"

propertyKeyValuePairList ::=
  propertyKeyValuePair [ "," propertyKeyValuePair ]

propertyKeyValuePair ::= propertyName ":" valueExpression
//
pathPattern ::= [{ simplePathPattern | quantifiedPathPattern }]+

simplePathPattern ::= nodePattern
  [ { relationshipPattern | quantifiedRelationship } nodePattern ]*
       
quantifiedPathPattern ::=
  "(" fixedPath [ "WHERE" booleanExpression ] ")" quantifier

fixedPath ::= nodePattern [ relationshipPattern nodePattern ]+    
                           
quantifiedRelationship ::= relationshipPattern quantifier

Quantifiers

quantifier ::=
  "*" | "+" | fixedQuantifier | generalQuantifier
fixedQuantifier ::= "{" unsignedInteger "}"
generalQuantifier ::= "{" lowerBound "," upperBound "}"
lowerBound ::= unsignedInteger
upperBound ::= unsignedInteger
unsignedInteger ::= [0-9]+
VariantCanonical formDescription
{m,n}{m,n}Between m and n iterations.
+{1,}1 or more iterations.
*{0,}0 or more iterations.
{n}{n,n}Exactly n iterations.
{m,}{m,}m or more iterations.
{,n}{0,n}Between 0 and n iterations.
{,}{0,}0 or more iterations.

请注意,带有量词{1}的量化路径模式不等同于固定长度的路径模式。尽管最终的量化路径模式将与其中包含的固定长度路径在没有量词的情况下匹配,但量词的存在意味着路径模式中的所有变量都将作为组变量公开。

Graph patterns

graphPattern ::=
  pathPattern [ "," pathPattern ]* [ "WHERE" booleanExpression ]

Node pattern pairs

编写一对相邻的节点模式是无效的语法。例如,以下所有操作都会引发语法错误:

然而,相邻的节点模式对的放置是有效的,它间接来自于量化路径模式的扩展。

量化路径模式迭代

当一个量化的路径模式被展开时,包含在其括号中的固定路径模式被重复和链接。这导致成对的节点模式彼此相邻。

((x:X)<--(y:Y)){3}

通过重复三次固定路径模式(x: x)←-(y: y)来扩展它,并在变量上添加索引以表明没有隐含的等量连接

(x1:X)<--(y1:Y)(x2:X)<--(y2:Y)(x3:X)<--(y3:Y)

结果是两对节点模式最终彼此相邻,(y1:Y)(x2:X)(y2:Y)(x3:X)。在匹配过程中,每对节点模式将匹配相同的节点,这些节点将满足节点模式中谓词的连接。例如,在第一对中,y1和x2将绑定到同一个节点,并且该节点必须具有X和y的标签。这种扩展和绑定如下图所示:

简单路径模式和量化路径模式

量化路径模式对

当两个量化路径模式相邻时,第一模式的最后一次迭代的最右节点与第二模式的第一次迭代的最左节点合并。例如,以下相邻的模式:

((:A)-[:R]->(:B)){2} ((:X)<--(:Y)){1,2}

将匹配与以下两个路径模式匹配的路径的并集相同的路径集:

(:A)-[:R]->(:B&A)-[:R]->(:B&X)<--(:Y)
(:A)-[:R]->(:B&A)-[:R]->(:B&X)<--(:Y&X)<--(:Y)

零迭代

如果量词允许模式的零次迭代,例如{0,3},那么该模式的第0次迭代将导致两边的节点模式配对。

(:X) ((a:A)-[:R]->(b:B)){0,1} (:Y)
//匹配
(:X&Y)   // 节点具有X,Y标签
(:X&A)-[:R]->(:B&Y)

变长关系

在Neo4j 5.9中引入量化路径模式和量化关系的语法之前,Cypher中匹配可变长度路径的唯一方法是使用可变长度关系。这个语法仍然可用。

VariantDescription
*1 or more iterations.
*nExactly n iterations.
*m..nBetween m and n iterations.
*m..m or more iterations.
*..nBetween 1 and n iterations.
Variable-length relationshipEquivalent quantified path pattern
(a)-[*2]->(b)(a) (()-[]->()){2,2} (b)
(a)-[:KNOWS*3..5]->(b)(a) (()-[:KNOWS]->()){3,5} (b)
(a)-[r*..5 {name: 'Filipa'}]->(b)(a) (()-[r {name: 'Filipa'}]->()){1,5} (b)

可变长度关系的变量可以在后续模式中使用,以引用该变量绑定到的关系列表。这与绑定到单个节点或关系的变量的等量连接相同。

值和类型

Cypher支持一系列数据值。在编写Cypher查询时,不可能声明数据类型。相反,Cypher将自动推断给定值的数据类型。

Property types

属性类型:BOOLEAN、DATE、DURATION、FLOAT、INTEGER、LIST、LOCAL DATETIME、LOCAL TIME、POINT、STRING、ZONED DATETIME和ZONED TIME。

  • 属性类型可以从Cypher查询返回

  • 属性类型可以用作参数

  • 属性类型可以存储为属性。

  • 属性类型可以用Cypher字面值构造。

简单类型的同构列表可以存储为属性,但一般列表(请参阅构造类型)不能存储为属性。作为属性存储的列表不能包含空值。

Cypher还提供了对字节数组的传递支持,字节数组可以作为属性值存储。由于性能原因,支持字节数组,因为使用Cypher的泛型LIST(其中每个INTEGER都有64位表示)的成本太高。但是,字节数组不被Cypher视为第一类数据类型,因此它们没有文字表示。

结构类型

结构类型:NODE、RELATIONSHIP和PATH。

  • 结构类型可以从Cypher查询返回

  • 结构类型不能用作参数。

  • 结构类型不能存储为属性。

  • 结构类型不能用Cypher字面值构造。

NODE数据类型包括:id、label(s)和属性映射。注意标签不是值,而是模式语法的一种形式。

RELATIONSHIP数据类型包括:id、关系类型、属性映射、开始节点id和结束节点id。

PATH数据类型是节点和关系的交替序列。

构造类型

构造类型中:LIST和MAP。

  • 可以从Cypher查询返回构造类型

  • 构造类型可以用作参数

  • 构造的类型不能存储为属性(同构列表除外)。

  • 构造类型可以用Cypher字面值构造。

LIST数据类型可以是简单值的同构集合,也可以是异构的有序值集合,每个值都可以具有任何属性、结构类型或构造类型。

MAP数据类型是(键、值)对的异构、无序集合,其中键是文字,而值可以具有任何属性、结构类型或构造类型。

构造类型值也可以包含null。

类型同义词

TypeSynonyms
ANYANY VALUE
BOOLEANBOOL
DATE
DURATION
FLOAT
INTEGERINT, SIGNED INTEGER
LIST<INNER_TYPE>ARRAY<INNER_TYPE>, INNER_TYPE LIST, INNER_TYPE ARRAY
LOCAL DATETIMETIMESTAMP WITHOUT TIMEZONE
LOCAL TIMETIME WITHOUT TIMEZONE
MAP
NODEANY NODE, VERTEX, ANY VERTEX
NOTHING
NULL
PATH
POINT
PROPERTY VALUEANY PROPERTY VALUE
RELATIONSHIPANY RELATIONSHIP, EDGE, ANY EDGE
STRINGVARCHAR
ZONED DATETIMETIMESTAMP WITH TIMEZONE
ZONED TIMETIME WITH TIMEZONE

所有Cypher类型都包含空值。要使它们不可为空,可以将not NULL附加到类型的末尾(例如BOOLEAN not NULL, LIST<FLOAT not NULL>)。

属性类型明细

TypeMin. valueMax. valuePrecision
BOOLEANFalseTrue-
DATE-999_999_999-01-01+999_999_999-12-31Days
DURATIONP-292471208677Y-6M-15DT-15H-36M-32SP292471208677Y6M15DT15H36M32.999999999SNanoseconds
FLOATDouble.MIN_VALUE [1]Double.MAX_VALUE64 bit
INTEGERLong.MIN_VALUELong.MAX_VALUE64 bit
LOCAL DATETIME-999_999_999-01-01T00:00:00+999_999_999-12-31T23:59:59.999999999Nanoseconds
LOCAL TIME00:00:0023:59:59.999999999Nanoseconds
POINTCartesian: (-Double.MAX_VALUE, -Double.MAX_VALUE)Cartesian_3D: (-Double.MAX_VALUE, -Double.MAX_VALUE, -Double.MAX_VALUE)WGS_84: (-180, -90)WGS_84_3D: (-180, -90, -Double.MAX_VALUE)Cartesian: (Double.MAX_VALUE, Double.MAX_VALUE)Cartesian_3D: (Double.MAX_VALUE, Double.MAX_VALUE, Double.MAX_VALUE)WGS_84: (180, 90)WGS_84_3D: (180, 90, Double.MAX_VALUE)The precision of each coordinate of the POINT is 64 bit as they are floats.
STRING---
ZONED DATETIME-999_999_999-01-01T00:00:00+18:00+999_999_999-12-31T23:59:59.999999999-18:00Nanoseconds
ZONED TIME00:00:00+18:0023:59:59.999999999-18:00Nanoseconds

时间类型

TypeDate supportTime supportTime zone support
DATE
LOCAL TIME
ZONED TIME
LOCAL DATETIME
ZONED DATETIME
DURATION---

相比之下,DURATION不是即时类型。DURATION表示时间量,捕获两个瞬间之间的时间差,并且可以为负值。

新的版本,类型名字有所改变

TypeOld type name
DATEDate
LOCAL TIMELocalTime
ZONED TIMETime
LOCAL DATETIMELocalDateTime
ZONED DATETIMEDateTime
DURATIONDuration

空间类型

null操作

逻辑操作

逻辑运算符(AND、OR、XOR、NOT)将null作为三值逻辑的未知值。

aba AND ba OR ba XOR bNOT a
falsefalsefalsefalsefalsetrue
falsenullfalse nullnulltrue
falsetruefalsetruetruetrue
truefalsefalsetruetruefalse
truenullnulltrue nullfalse
truetruetruetruefalsefalse
nullfalsefalse nullnullnull
nullnullnullnullnullnull
nulltruenulltrue nullnull

总结:

  • AND:只要有一个为false,则为false。
  • OR:只要有一个为true,则为true。

IN

IN操作符遵循类似的逻辑。如果Cypher可以确定列表中存在某物,则结果将为真。任何包含null没有匹配元素的列表都将返回null。否则,结果将为false。

ExpressionResult
2 IN [1, 2, 3]true
2 IN [1, null, 3]null
2 IN [1, 2, null]true
2 IN [1]false
2 IN []false
null IN [1, 2, 3]null
null IN [1, null, 3]null
null IN []false

使用all、any、none和single遵循类似的规则。如果结果可以确定地计算出来,则返回true或false。否则将产生null。

[ ]

访问带有null的list或map将返回null

返回null的表达式

  • 从列表中获取缺失的元素:[][0]head([])

  • 试图访问节点或关系上不存在的属性:n.missingProperty

  • 任何一方为空时的比较:1 < null。

  • 包含null的算术表达式:1 + null。

  • 某些函数调用的任何参数都为空:例如,sin(null)。

LIST

RETURN [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] AS list
RETURN range(0, 10)[3] AS element			//range创建LIST
RETURN range(0, 10)[-3] AS element			//下标支持负数
RETURN range(0, 10)[0..3] AS list			//切片
RETURN range(0, 10)[0..-5] AS list			//
RETURN range(0, 10)[-5..] AS list			//
RETURN range(0, 10)[..4] AS list			//
RETURN range(0, 10)[15] AS list				//超过索引的单个元素返回null。
RETURN range(0, 10)[5..15] AS list			//超过索引的LIST 元素截断。

MAP

RETURN {key: 'Value', listKey: [{inner: 'Map1'}, {inner: 'Map2'}]}
                                                  

Map 投影

Cypher支持Map投影,它允许从节点、关系和其他Map值构造Map投影。

Map投影以绑定到要进行投影的图形实体的变量开始,并包含一组逗号分隔的映射元素,由{}括起来。

map_variable {map_element, [, ...n]}

MAP投影将一个或多个键值对投影到MAP投影。有四种不同类型的MAP投影元素:

  • 属性选择器:将属性名称作为进行投影,并将map_variable中的作为投影的

  • 字面量实体 :这是一个键值对,值是一个任意的表达式键:<expression>

  • 变量选择器:投影一个变量,变量名作为键,变量指向的值作为投影的值。它的语法就是变量。

  • 所有属性选择器:从map_variable值投射所有键值对。

  • 如果map_variable指向null,则整个MAP投影的值将为null。

  • 映射中的键名必须是STRING类型。

MATCH (keanu:Person {name: 'Keanu Reeves'})-[:ACTED_IN]->(movie:Movie)
WITH keanu, collect(movie{.title, .released}) AS movies
RETURN keanu{.name, movies: movies}	//  name属性作为一个元素,movies字面量,作为KEY, movies变量作为VALUE,是个LIST
keanu
{movies: [{title: "The Devils Advocate", released: 1997}, {title: "The Matrix Revolutions", released: 2003}, {title: "The Matrix Resurrections", released: 2021}, {title: "The Matrix Reloaded", released: 2003}, {title: "The Matrix", released: 1999}], name: "Keanu Reeves"}
Rows: 1

类型转换

参考 Functions

附录

参考

https://neo4j.com/docs/cypher-manual/current/patterns/

https://neo4j.com/docs/cypher-manual/current/values-and-types/

https://neo4j.com/docs/cypher-manual/current/functions/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/843389.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Java Map集合详解 :HashMap类

Map 是一种键-值对&#xff08;key-value&#xff09;集合&#xff0c;Map 集合中的每一个元素都包含一个键&#xff08;key&#xff09;对象和一个值&#xff08;value&#xff09;对象。用于保存具有映射关系的数据。 Map 集合里保存着两组值&#xff0c;一组值用于保存 Map …

FAST协议详解1 不同数据类型的编码与解码

一、概述 FAST协议里不同的数据类型在编码时有非常大的区别&#xff0c;比如整数只需要将二进制数据转为十进制即可&#xff0c;而浮点数则需要先传小数点位数&#xff0c;再传一个整数&#xff0c;最后将二者结合起来才是最终结果。本篇使用openfast自设了一些数据并编码成FA…

一文了解 Android Auto 车载开发~

作者&#xff1a;牛蛙点点申请出战 背景 我的的产品作为一个海外音乐播放器&#xff0c;在车载场景听歌是一个很普遍的需求。在用户反馈中&#xff0c;也有很多用户提到希望能在车上播放音乐。同时车载音乐也可以作为提升用户消费时长一个抓手。 出海产品&#xff0c;主要服务…

[国产MCU]-BL602开发实例-定时器

定时器 文章目录 定时器1、BL602定时器介绍2、定时器驱动API介绍3、定时器使用实例3.1 单次计时3.2 持续计时通用定时器,用于定时,当时间到达我们所设置的定时时间会产生定时中断,可以用来完成定时任务。本文将详细介绍如何使用BL602的定时器功能。 1、BL602定时器介绍 BL6…

vscode自动添加注释说明

1. 安装vscode 双击安装程序,默认安装即可(如:VSCodeSetup-x64-1.70.2.exe) 2. 安装doxygen文档生成插件 1> 打开vscode软件,点击左侧插件管理菜单 2> 点击右上角’…‘按钮,选择’Install from VSIX’(联网状态可以直接搜索doxygen下载安装) 3> 选择doxygen离线安装…

torchvision.datasets数据加载失败

torchvision.datasets数据加载失败 如何使用torchvision.datasets进行自动下载数据失败&#xff0c;可以使用手动下载数据 Ctrl点击可以进入相关包文件&#xff0c;查找下载地址&#xff1a;https://www.cs.toronto.edu/~kriz/cifar-10-python.tar.gz 手动下载之后解压&#x…

【Spring】(四)Bean 的作用域和生命周期

文章目录 前言一、Bean 的作用域1.1 被修改的 Bean 案例1.2 作用域的定义1.3 Bean 的六种作用域1.4 Bean 作用域的设置 二、Spring 的执行流程 和 Bean 的生命周期2.1 Spring 的执行流程2.2 Bean 的生命周期2.3 Bean 生命周期的演示 前言 Bean 是 Spring 框架中的一个核心概念…

Benchmarking Augmentation Methods for Learning Robust Navigation Agents 论文阅读

论文信息 题目&#xff1a;Benchmarking Augmentation Methods for Learning Robust Navigation Agents: the Winning Entry of the 2021 iGibson Challenge 作者&#xff1a;Naoki Yokoyama, Qian Luo 来源&#xff1a;arXiv 时间&#xff1a;2022 Abstract 深度强化学习和…

AssetBundleBrowser导入报错解决方案

第一次导入AssetBundleBrowser遇到报错有 Assets\Scenes\AssetBundles-Browser-master\AssetBundles-Browser-master\Tests\Editor\ABModelTests.cs(13,7): error CS0246: The type or namespace name Boo could not be found (are you missing a using directive or an assem…

24届近5年杭州电子科技大学自动化考研院校分析

今天给大家带来的是杭州电子科技大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、杭州电子科技大学 学校简介 杭州电子科技大学&#xff08;Hangzhou Dianzi University&#xff09;&#xff0c;简称“杭电”&#xff0c;位于杭州市&#xff0c;是浙江省人民政…

Containerd容器镜像管理

1. 轻量级容器管理工具 Containerd 2. Containerd的两种安装方式 3. Containerd容器镜像管理 4. Containerd数据持久化和网络管理 1、Containerd镜像管理 1.1 Containerd容器镜像管理命令 docker使用docker images命令管理镜像单机containerd使用ctr images命令管理镜像,con…

消息队列 -封装数据库的操作

前言 上一篇博客我们写了, 关于交换机, 队列,绑定, 写入数据库的一些建库建表的操作 这一篇博客中,我们将建库建表操作,封装一下实现层一个类来供上层服务的调用 , 并在写完该类之后, 测试代码是否完整 实现封装 在写完上述的接口类 与 xml 后, 我们想要 创建一个类 ,来调用…

Neety与IO模型简介

Netty与IO模型简介 1、Netty 是由 JBOSS 提供的一个 Java 开源框架&#xff0c;现为 Github 上的独立项目。 2、Netty 是一个异步的、基于事件驱动的网络应用框架&#xff0c;用以快速开发高性能、高可靠性的网络 IO 程序。 3、Netty 主要针对在 TCP 协议下&#xff0c;面向…

2023牛客暑期多校训练营7-c-Beautiful Sequence

思路&#xff1a; &#xff0c;则有&#xff0c;也就是说只要知道A1就可以求任意A。由于A是升序排列&#xff0c;所以对于任意&#xff0c;二进制所包含1的最高位第k位来说&#xff0c;表明与第k位相反&#xff0c;要大一些&#xff0c;所以它的第k位为1&#xff0c;的第k位为…

echarts 柱状图 实例

实例效果&#xff1a; 代码&#xff1a; draw(data1, data2,data3) {var option {// backgroundColor: rgb(10,36,68),tooltip: {trigger: axis,axisPointer: {type: shadow,},formatter: function (params: any, ticket: any, callback: any) {const item params[0];var str…

关于“为爱发电”的一些说明~~

对不起&#xff0c;兄弟们&#xff0c;收费了。。 1. 为什么设置收费 emm...混口饭吃。 也是大龄程序员积在极探索挣钱之路。 2. 都有哪些服务 本专栏的手把手教学资料工程文件&#xff0c;但是近期忙于CMN&#xff0c;可能没时间答疑和讨论&#xff0c;见谅。 另外&#xff0…

知识图谱实战应用23-【知识图谱的高级用法】Neo4j图算法的Cypher查询语句实例

大家好,我是微学AI,今天给大家介绍一下知识图谱实战应用23-【知识图谱的高级用法】Neo4j图算法的Cypher查询语句实例,Neo4j图算法是一套在Neo4j图数据库上运行的算法集合。这些算法专门针对图数据结构进行设计,用于分析、查询和处理图数据。图算法可以帮助我们发现图中的模…

class version 61 java version 17.0.4

class version (javap -verbose xxxx.class)_spencer_tseng的博客-CSDN博客

概念解析 | 合成孔径雷达中运动补偿与自聚焦的关系

注1:本文系“概念解析”系列之一,致力于简洁清晰地解释、辨析复杂而专业的概念。本次辨析的概念是:合成孔径雷达中运动补偿和自聚焦的联系与差别 概念解析 | 合成孔径雷达运动补偿与自聚焦的关系研究 基于二维空变运动补偿的机动平台大斜视SAR稀疏自聚焦方法 一、背景介绍 合成…

qt源码---事件系统之QCoreApplication

上一节分析了qt和windows系统之间的消息的传递&#xff0c;本节着重看一下&#xff0c;qt内部的事件是如何传递的&#xff1f; 1.sendEvent函数 在使用的自定义事件时&#xff0c;有时需要手动抛出一个事件&#xff0c;常用的方式有2种&#xff0c;其一时阻塞式的sendEvent函…