neo4j查询语言Cypher详解(三)--函数

这篇具有很好参考价值的文章主要介绍了neo4j查询语言Cypher详解(三)--函数。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

函数

Cypher中的函数如果输入参数为null,则返回null。

以字符串作为输入的函数都对Unicode字符进行操作,而不是对标准字符进行操作。例如,size()函数应用于任何Unicode字符将返回1,即使该字符不适合一个字符的16位。

可以通过 SHOW FUNCTIONS 查看函数定义。

函数签名中参数格式:eg:

all(
    variable :: VARIABLE 		//:: VARIABLE,说明是个变量,可用于后面的 WHERE 部分
	IN 
list :: LIST OF ANY? 			//list,是个LIST泛型。
WHERE predicate :: ANY?			// predicate,是任意的断言
) 
:: (BOOLEAN?)					//函数返回值类型为BOOLEAN

断言函数

Function Signature Description
all() all(variable :: VARIABLE IN list :: LIST OF ANY? WHERE predicate :: ANY?) :: (BOOLEAN?) Returns true if the predicate holds for all elements in the given list.
any() any(variable :: VARIABLE IN list :: LIST OF ANY? WHERE predicate :: ANY?) :: (BOOLEAN?) Returns true if the predicate holds for at least one element in the given list.
exists() exists(input :: ANY?) :: (BOOLEAN?) Returns true if a match for the pattern exists in the graph.
isEmpty() isEmpty(input :: LIST? OF ANY?) :: (BOOLEAN?) Checks whether a list is empty.
isEmpty() isEmpty(input :: MAP?) :: (BOOLEAN?) Checks whether a map is empty.
isEmpty() isEmpty(input :: STRING?) :: (BOOLEAN?) Checks whether a string is empty.
none() none(variable :: VARIABLE IN list :: LIST OF ANY? WHERE predicate :: ANY?) :: (BOOLEAN?) Returns true if the predicate holds for no element in the given list.
single() single(variable :: VARIABLE IN list :: LIST OF ANY? WHERE predicate :: ANY?) :: (BOOLEAN?) Returns true if the predicate holds for exactly one of the elements in the given list.

标量函数

Function Signature Description
coalesce() coalesce(input :: ANY?) :: (ANY?) 返回第一个非null值。
endNode() endNode(input :: RELATIONSHIP?) :: (NODE?) Returns the end node of a relationship.
head() head(list :: LIST? OF ANY?) :: (ANY?) Returns the first element in a list.
id() id(input :: NODE?) :: (INTEGER?) Deprecated Returns the id of a node. Replaced by elementId()
id(input :: RELATIONSHIP?) :: (INTEGER?) Deprecated Returns the id of a relationship. Replaced by elementId().
last() last(list :: LIST? OF ANY?) :: (ANY?)
length() length(input :: PATH?) :: (INTEGER?) Returns the length of a path.
properties() properties(input :: MAP?) :: (MAP?) 返回一个对象的所有属性,作为一个map
properties(input :: NODE?) :: (MAP?) 返回一个节点的所有属性,作为一个map
properties(input :: RELATIONSHIP?) :: (MAP?) 返回一个关系的所有属性,作为一个map
randomUUID() randomUUID() :: (STRING?)
size() size(input :: LIST? OF ANY?) :: (INTEGER?) Returns the number of items in a list.
size(input :: STRING?) :: (INTEGER?) Returns the number of Unicode characters in a string.
startNode() startNode(input :: RELATIONSHIP?) :: (NODE?)
toBoolean() toBoolean(input :: STRING?) :: (BOOLEAN?)
toBoolean(input :: BOOLEAN?) :: (BOOLEAN?)
toBoolean(input :: INTEGER?) :: (BOOLEAN?)
toBooleanOrNull() toBooleanOrNull(input :: ANY?) :: (BOOLEAN?) 转换为boolean,不能转换返回null。
toFloat() toFloat(input :: NUMBER?) :: (FLOAT?)
toFloat(input :: STRING?) :: (FLOAT?)
toFloatOrNull() toFloatOrNull(input :: ANY?) :: (FLOAT?) 转换为小数,不能转换返回null。
toInteger() toInteger(input :: NUMBER?) :: (INTEGER?)
toInteger(input :: BOOLEAN?) :: (INTEGER?)
toInteger(input :: STRING?) :: (INTEGER?)
toIntegerOrNull() toIntegerOrNull(input :: ANY?) :: (INTEGER?) 转换为整形,不能转换返回null。
type() type(input :: RELATIONSHIP?) :: (STRING?) Returns the string representation of the relationship type.

示例

CREATE (p:Person {name: 'Stefan', city: 'Berlin'})
RETURN properties(p)
//OUT PUT:
//: {"city":"Berlin","name":"Stefan"}

聚合函数

Function Signature Description
avg() avg(input :: DURATION?) :: (DURATION?)
avg(input :: FLOAT?) :: (FLOAT?)
avg(input :: INTEGER?) :: (INTEGER?)
collect() collect(input :: ANY?) :: (LIST? OF ANY?) 收集数据作为一个LIST。
count() count(input :: ANY?) :: (INTEGER?)
max() max(input :: ANY?) :: (ANY?)
min() min(input :: ANY?) :: (ANY?)
percentileCont() percentileCont(input :: FLOAT?, percentile :: FLOAT?) :: (FLOAT?)
percentileDisc() percentileDisc(input :: FLOAT?, percentile :: FLOAT?) :: (FLOAT?)
`percentileDisc(input :: INTEGER?, percentile :: FLOAT?) :: (INTEGER?)
stdev() stdev(input :: FLOAT?) :: (FLOAT?)
stdevp() stdevp(input :: FLOAT?) :: (FLOAT?)
sum() sum(input :: DURATION?) :: (DURATION?)
`sum(input :: FLOAT?) :: (FLOAT?)
`sum(input :: INTEGER?) :: (INTEGER?)

集合函数

Function Signature Description
keys() keys(input :: MAP?) :: (LIST? OF STRING?) 返回MAP的所有KEY LIST
keys(input :: NODE?) :: (LIST? OF STRING?) 返回节点的所有属性 LIST
keys(input :: RELATIONSHIP?) :: (LIST? OF STRING?) 返回关系的所有属性 LIST
labels() labels(input :: NODE?) :: (LIST? OF STRING?) Returns a list containing the string representations for all the labels of a node.
nodes() nodes(input :: PATH?) :: (LIST? OF NODE?) Returns a list containing all the nodes in a path.
range() range(start :: INTEGER?, end :: INTEGER?) :: (LIST? OF INTEGER?) Returns a list comprising all integer values within a specified range.
range(start :: INTEGER?, end :: INTEGER?, step :: INTEGER?) :: (LIST? OF INTEGER?) Returns a list comprising all integer values within a specified range created with step length.
reduce() `reduce(accumulator :: VARIABLE = initial :: ANY?, variable :: VARIABLE IN list :: LIST OF ANY? expression :: ANY) :: (ANY?)`
relationships() relationships(input :: PATH?) :: (LIST? OF RELATIONSHIP?) Returns a list containing all the relationships in a path.
reverse() reverse(input :: LIST? OF ANY?) :: (LIST? OF ANY?) Returns a list in which the order of all elements in the original list have been reversed.
tail() tail(input :: LIST? OF ANY?) :: (LIST? OF ANY?) Returns all but the first element in a list.
toBooleanList() toBooleanList(input :: LIST? OF ANY?) :: (LIST? OF BOOLEAN?)
toFloatList() toFloatList(input :: LIST? OF ANY?) :: (LIST? OF FLOAT?)
toIntegerList() toIntegerList(input :: LIST? OF ANY?) :: (LIST? OF INTEGER?)
toStringList() toStringList(input :: LIST? OF ANY?) :: (LIST? OF STRING?)

示例

toBooleanList()

RETURN toBooleanList(null) as noList,
toBooleanList([null, null]) as nullsInList,
toBooleanList(['a string', true, 'false', null, ['A','B']]) as mixedList
noList nullsInList mixedList
<null> [<null>,<null>] [<null>,true,false,<null>,<null>]

总结:

  • 参数不是个LIST,报错
  • LIST 中的null,不转换,保留
  • LIST中的不可转换元素,结果为null。
  • BOOLEAN类型的元素,保留原始值

toFloatListtoIntegerListtoStringListtoBooleanList 规则类似。

数值函数

Function Signature Description
abs() abs(input :: FLOAT?) :: (FLOAT?)
abs(input :: INTEGER?) :: (INTEGER?)
ceil() ceil(input :: FLOAT?) :: (FLOAT?)
floor() floor(input :: FLOAT?) :: (FLOAT?)
isNaN() isNaN(input :: FLOAT?) :: (BOOLEAN?) Returns true if the floating point number is NaN.
isNaN(input :: INTEGER?) :: (BOOLEAN?)
rand() rand() :: (FLOAT?)
round() round(input :: FLOAT?) :: (FLOAT?)
round(value :: FLOAT?, precision :: NUMBER?) :: (FLOAT?)
round(value :: FLOAT?, precision :: NUMBER?, mode :: STRING?) :: (FLOAT?)
sign() sign(input :: FLOAT?) :: (INTEGER?)
sign(input :: INTEGER?) :: (INTEGER?)

对数函数

Function Signature Description
e() e() :: (FLOAT?) 返回e。
exp() exp(input :: FLOAT?) :: (FLOAT?) 返回e^n。
log() log(input :: FLOAT?) :: (FLOAT?) 返回自然对数,以e为底
log10() log10(input :: FLOAT?) :: (FLOAT?) 返回以10位底的对数
sqrt() sqrt(input :: FLOAT?) :: (FLOAT?) 平方差

三角函数

Function Signature Description
acos() acos(input :: FLOAT?) :: (FLOAT?)
asin() `asin(input :: FLOAT?) :: (FLOAT?)
atan() atan(input :: FLOAT?) :: (FLOAT?)
atan2() atan2(y :: FLOAT?, x :: FLOAT?) :: (FLOAT?)
cos() cos(input :: FLOAT?) :: (FLOAT?)
cot() cot(input :: FLOAT?) :: (FLOAT?)
degrees() degrees(input :: FLOAT?) :: (FLOAT?) 将弧度转换为角度
haversin() haversin(input :: FLOAT?) :: (FLOAT?) 半正矢计算
pi() pi() :: (FLOAT?)
radians() radians(input :: FLOAT?) :: (FLOAT?) 将角度转换为弧度
sin() sin(input :: FLOAT?) :: (FLOAT?)
tan() tan(input :: FLOAT?) :: (FLOAT?)

字符串函数

Function Signature Description
left() left(original :: STRING?, length :: INTEGER?) :: (STRING?)
ltrim() ltrim(input :: STRING?) :: (STRING?)
replace() replace(original :: STRING?, search :: STRING?, replace :: STRING?) :: (STRING?)
reverse() reverse(input :: STRING?) :: (STRING?)
right() `right(original :: STRING?, length :: INTEGER?) :: (STRING?)
rtrim() rtrim(input :: STRING?) :: (STRING?)
split() split(original :: STRING?, splitDelimiter :: STRING?) :: (LIST? OF STRING?)
split(original :: STRING?, splitDelimiters :: LIST? OF STRING?) :: (LIST? OF STRING?)
substring() substring(original :: STRING?, start :: INTEGER?) :: (STRING?) 从0开始
substring(original :: STRING?, start :: INTEGER?, length :: INTEGER?) :: (STRING?)
toLower() toLower(input :: STRING?) :: (STRING?)
toString() toString(input :: ANY?) :: (STRING?)
toStringOrNull() toStringOrNull(input :: ANY?) :: (STRING?)
toUpper() toUpper(input :: STRING?) :: (STRING?)
trim() trim(input :: STRING?) :: (STRING?)

时间函数

Function Signature Description
date() date(input = DEFAULT_TEMPORAL_ARGUMENT :: ANY?) :: (DATE?) 创建DATE
date.realtime() date.realtime(timezone = DEFAULT_TEMPORAL_ARGUMENT :: ANY?) :: (DATE?) 使用 realtime clock 创建当前DATE
date.statement() date.statement(timezone = DEFAULT_TEMPORAL_ARGUMENT :: ANY?) :: (DATE?) 使用 statement clock 创建当前DATE
date.transaction() date.transaction(timezone = DEFAULT_TEMPORAL_ARGUMENT :: ANY?) :: (DATE?) 使用 transaction clock 创建当前DATE
date.truncate() date.truncate(unit :: STRING?, input = DEFAULT_TEMPORAL_ARGUMENT :: ANY?, fields = null :: MAP?) :: (DATE?) 截断DATE
datetime() datetime(input = DEFAULT_TEMPORAL_ARGUMENT :: ANY?) :: (DATETIME?)
datetime.fromepoch() datetime.fromepoch(seconds :: NUMBER?, nanoseconds :: NUMBER?) :: (DATETIME?)
datetime.fromepochmillis() datetime.fromepochmillis(milliseconds :: NUMBER?) :: (DATETIME?)
datetime.realtime() datetime.realtime(timezone = DEFAULT_TEMPORAL_ARGUMENT :: ANY?) :: (DATETIME?)
datetime.statement() datetime.statement(timezone = DEFAULT_TEMPORAL_ARGUMENT :: ANY?) :: (DATETIME?)
datetime.transaction() datetime.transaction(timezone = DEFAULT_TEMPORAL_ARGUMENT :: ANY?) :: (DATETIME?)
datetime.truncate() datetime.truncate(unit :: STRING?, input = DEFAULT_TEMPORAL_ARGUMENT :: ANY?, fields = null :: MAP?) :: (DATETIME?)
localdatetime() localdatetime(input = DEFAULT_TEMPORAL_ARGUMENT :: ANY?) :: (LOCALDATETIME?)
localdatetime.realtime() localdatetime.realtime(timezone = DEFAULT_TEMPORAL_ARGUMENT :: ANY?) :: (LOCALDATETIME?)
localdatetime.statement() localdatetime.statement(timezone = DEFAULT_TEMPORAL_ARGUMENT :: ANY?) :: (LOCALDATETIME?)
localdatetime.transaction() localdatetime.transaction(timezone = DEFAULT_TEMPORAL_ARGUMENT :: ANY?) :: (LOCALDATETIME?)
localdatetime.truncate() localdatetime.truncate(unit :: STRING?, input = DEFAULT_TEMPORAL_ARGUMENT :: ANY?, fields = null :: MAP?) :: (LOCALDATETIME?)
localtime() localtime(input = DEFAULT_TEMPORAL_ARGUMENT :: ANY?) :: (LOCALTIME?)
localtime.realtime() localtime.realtime(timezone = DEFAULT_TEMPORAL_ARGUMENT :: ANY?) :: (LOCALTIME?)
localtime.statement() localtime.statement(timezone = DEFAULT_TEMPORAL_ARGUMENT :: ANY?) :: (LOCALTIME?)
localtime.transaction() localtime.transaction(timezone = DEFAULT_TEMPORAL_ARGUMENT :: ANY?) :: (LOCALTIME?)
localtime.truncate() localtime.truncate(unit :: STRING?, input = DEFAULT_TEMPORAL_ARGUMENT :: ANY?, fields = null :: MAP?) :: (LOCALTIME?)
time() time(input = DEFAULT_TEMPORAL_ARGUMENT :: ANY?) :: (TIME?)
time.realtime() time.realtime(timezone = DEFAULT_TEMPORAL_ARGUMENT :: ANY?) :: (TIME?)
time.statement() time.statement(timezone = DEFAULT_TEMPORAL_ARGUMENT :: ANY?) :: (TIME?)
time.transaction() time.transaction(timezone = DEFAULT_TEMPORAL_ARGUMENT :: ANY?) :: (TIME?)
time.truncate() time.truncate(unit :: STRING?, input = DEFAULT_TEMPORAL_ARGUMENT :: ANY?, fields = null :: MAP?) :: (TIME?)

时钟控制

  • transaction: 同一个事务,时间返回相同值。
  • statement: 同一个语句的同一次调用,时间返回相同值。
  • realtime: 系统时间。

截断单位

  • millennium:千年
  • century:世纪
  • decade:十年
  • year:
  • weekYear:
  • quarter:
  • month:
  • week:
  • day:
  • hour:
  • minute:
  • second:
  • millisecond: 毫秒
  • microsecond: 微秒

示例

date([{timezone}])
RETURN date() AS currentDate
RETURN date({timezone: 'America/Los Angeles'}) AS currentDateInLA

date({year [, month, day]})
UNWIND [
date({year: 1984, month: 10, day: 11}),
date({year: 1984, month: 10}),
date({year: 1984})
] AS theDate
RETURN theDate

date({year [, week, dayOfWeek]})
UNWIND [
date({year: 1984, week: 10, dayOfWeek: 3}),
date({year: 1984, week: 10}),
date({year: 1984})
] AS theDate
RETURN theDate

所有时间函数,都支持通过一个Map对象构造时间实例。

duration函数

Function Signature Description
duration() duration(input :: ANY?) :: (DURATION?)
duration.between() duration.between(from :: ANY?, to :: ANY?) :: (DURATION?) 计算2个时间差
duration.inDays() duration.inDays(from :: ANY?, to :: ANY?) :: (DURATION?)
duration.inMonths() duration.inMonths(from :: ANY?, to :: ANY?) :: (DURATION?)
duration.inSeconds() duration.inSeconds(from :: ANY?, to :: ANY?) :: (DURATION?)

示例

duration([ {years, quarters, months, weeks, days, hours, minutes, seconds, milliseconds, microseconds, nanoseconds} ])
            
duration(temporalAmount)   // temporalAmount STRING类型
            

duration标准字符串格式:P[nY][nM][nW][nD][T[nH][nM][nS]],具体见:https://neo4j.com/docs/cypher-manual/current/values-and-types/temporal/#cypher-temporal-specifying-durations

duration.between(instant1, instant2)
                 

字段

  • years
  • quarters
  • months
  • weeks
  • days
  • hours
  • minutes
  • seconds
  • milliseconds
  • microseconds
  • nanoseconds

空间函数

Function Signature Description
point.distance() `point.distance(from :: POINT?, to :: POINT?) :: (FLOAT?)
point() - Cartesian 2D point(input :: MAP?) :: (POINT?)
point() - Cartesian 3D point(input :: MAP?) :: (POINT?)
point() - WGS 84 2D `point(input :: MAP?) :: (POINT?)
point() - WGS 84 3D `point(input :: MAP?) :: (POINT?)
point.withinBBox() point.withinBBox(point :: POINT?, lowerLeft :: POINT?, upperRight :: POINT?) :: (BOOLEAN?)

加载 CSV 函数

Function Signature Description
file() file() :: (STRING?) 返回文件路径
linenumber() linenumber() :: (INTEGER?) 返回行数

Graph functions

Function Signature Description
graph.names() graph.names() :: (LIST? OF STRING?)
graph.propertiesByName() graph.propertiesByName(name :: STRING?) :: (MAP?)
graph.byName() USE graph.byName(name :: STRING?)

用户自定义函数

Type Description Usage Developing
Scalar For each row the function takes parameters and returns a result. Using UDF Extending Neo4j (UDF)
Aggregating Consumes many rows and produces an aggregated result. Using aggregating UDF Extending Neo4j (Aggregating UDF)

附录

参考

https://neo4j.com/docs/cypher-manual/current/functions/文章来源地址https://www.toymoban.com/news/detail-633413.html

到了这里,关于neo4j查询语言Cypher详解(三)--函数的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 图数据库_Neo4j学习cypher语言_使用CQL命令002_删除节点_删除属性_结果排序Order By---Neo4j图数据库工作笔记0006

    然后我们再来看如何删除节点   可以看到首先   我们这里   比如我要删除张三 可以看到 match (n:student) where n.name = \\\"张三\\\" delete n 这样就是删除了student集合中,name是张三的节点   然后我们再来看 如何来删除关系 match (n:student)-[r]-(m:student) where n.name=\\\"小

    2024年02月12日
    浏览(49)
  • 图数据库_Neo4j学习cypher语言_使用CQL_构建明星关系图谱_导入明星数据_导入明星关系数据_创建明星关系---Neo4j图数据库工作笔记0009

    首先找到明星数据   可以看到有一个sheet1,是,记录了所有的关系的数据   然后比如我们搜索一个撒贝宁,可以看到撒贝宁的数据   然后这个是构建的CQL语句   首先我们先去启动服务 neo4j console     然后我们再来看一下以前导入的,可以看到导入很简单, 就是上面有CQL 看一下节

    2024年02月12日
    浏览(42)
  • 图数据库Neo4j——Neo4j简介、数据结构 & Docker版本的部署安装 & Cypher语句的入门

    MySQL是一种开源的关系型数据库管理系统,使用SQL作为其查询语言,常见的关系型数据库有MySQL、Oracle、SQL Server、PostgreSQL等。相关博客文章如下: 【合集】MySQL的入门进阶强化——从 普通人 到 超级赛亚人 的 华丽转身 PostgreSQL数据库——Docker版本的postgres安装 Navicat连接方式

    2024年02月06日
    浏览(58)
  • Neo4j Cypher语法教程 实体、关系增删改、高级查询

    安装完neo4j ,访问对应的web页面端口,输入以下命令进行学习 创建节点 创建一个标签为stu的节点 (标签:将数据进行分类,方便管理) 创建一个标签为stu 且带有属性值的节点 查询节点 按照标签查询 运行结果如下图 neo4j默认是将name属性用于展示 按照id进行查询 按照属性进

    2024年02月06日
    浏览(37)
  • 图数据库 之 Neo4j - Cypher语法基础(5)

    节点(Nodes) Cypher使用()来表示一个节点。 属性可以用来存储信息或者来条件匹配(查找) 创建节点 创建如下节点

    2024年02月19日
    浏览(41)
  • 图数据库Neo4j学习二——cypher基本语法

    名称应以字母字符开头,不以数字开头,名称不应包含符号,下划线除外 可以很长,最多65535( 2^16 - 1) 或65534字符,具体取决于 Neo4j 的版本 名称区分大小写。:PERSON和:Person是:person三个不同的标签,并且n和N是两个不同的变量。 前导和尾随空白字符将被自动删除。例如, 以下

    2024年02月16日
    浏览(48)
  • 知识图谱实战应用23-【知识图谱的高级用法】Neo4j图算法的Cypher查询语句实例

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

    2024年02月14日
    浏览(44)
  • neo4j教程-Cypher操作

    Cypher是图形存储数据库Neo4j的查询语言,Cypher是通过模式匹配Neo4j数据库中的节点和关系,从而对数据库Neo4j中的节点和关系进行一系列的相关操作。 下面,通过一张表来介绍一下常用的Neo4j操作命令及相关说明,具体如表所示。 操作命令 相关说明 CREATE 创建节点、关系 MATC

    2024年02月15日
    浏览(47)
  • Neo4j 与 Cypher 基础

    更好的阅读体验 huge{color{red}{更好的阅读体验}} 更好的阅读体验 Neo4j 是用 Java 实现的开源 NoSQL 图数据库。从2003年开始开发,2007年正式发布第一版,其源码托管于 GitHub。 与常见的关系型数据库不同, Neo4j 基于图图结构来表示和存储数据,并提供了申明式的查询语言 Cypher

    2024年02月07日
    浏览(45)
  • 图数据库Neo4j——SpringBoot使用Neo4j & 简单增删改查 & 复杂查询初步

    图形数据库是专门用于存储图形数据的数据库,它使用图形模型来存储数据,并且支持复杂的图形查询。常见的图形数据库有Neo4j、OrientDB等。 Neo4j是用Java实现的开源NoSQL图数据库,本篇博客介绍如何在SpringBoot中使用Neo4j图数据库,如何进行简单的增删改查,以及如何进行复杂

    2024年02月06日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包