想要查询输出一个标签对应的多个边的问题

  • nebula 版本:3.2.0

  • 部署方式: 单机

  • 安装方式: RPM

  • 是否为线上版本:Y

  • 硬件信息

    • 磁盘 20g( 推荐使用 SSD)
    • CPU、内存信息 16g
  • 问题的具体描述 我的数据有人,房间两个tag,入住一种边(人指向房)。正常情况一个人开一个房,很少有一个人开多间房。希望将开多间房的人tag选择出来并输出。按照官网的例子看完了,发现match语句比较适合我的需求,但给的都是具体的某个tag开始匹配他的属性。想要问问有木有模糊一点的查询方式,即可以便利完所有tag

  • 相关的 meta / storage / graph info 日志信息

代码 / 终端输出 / 日志…

在 nebula 2.0-2.5 版本是支持实体单 tag 模糊取属性的,语句类似:

MATCH (v:player)-->(n) where n.name starts with "A" return v.name

上述语句语法形式上与 cypher 完全一致,对于变量 n 来说,并不需要知道具体的 tag 来取属性,实际上很多查询场景中也并不能知道具体的 tag,所以我认为这种需求是成立的。
但当初的实现中存在一个问题,如果是多 tag 实体且不同 tag 有同名属性,这种语法是有歧义的。当时定的方案是用户必须显式地指定 tag 以消除查询歧义,故在之后的版本模糊取属性不再支持且一部分 cypher 语言表达能力也丧失了。

1 个赞

我理解你的需求是并不会笼统地建一个叫 person 的 tag,而是多种 tag(比如:student、actor…),然后在某些公共属性上的查询行为是一致的?

1 个赞

不是属性值,简洁地说就是想知道tag的出边数量,把出边大于2的筛选出来

大于等于2 可以这样:

MATCH (:房间)<-[:入住]-(v:人)-[:入住]->(:房间)
RETURN distinct v

大于 2:

MATCH (v:人)-[:入住]->(:房间)
where size((v)-[:入住]->())>2
RETURN distinct v
1 个赞

解决了,辛苦大佬了,实在是太太太感谢了 :joy:

再次打扰下大佬。。
如果想看房间入边大于2以上,应该怎么写

MATCH (v:人)-[:入住]->(n:房间)
WITH n,count(*) AS c where c>2
RETURN n
1 个赞

感谢大佬。提示内存崩了 :dizzy_face:登不进去了 我等下再试试。

是不是有了with语句就无法返回边的关系了呀
return时一直提示边的变量没有定义

是的。with 子句会屏蔽变量可见域。

MATCH (v:人)-[:入住]->(n:房间)
WITH n,count(*) AS c where c>2
MATCH (:人)-[e:入住]->(n)
RETURN e

3 个赞

感谢大佬,运行通了。with后接的搜索语句 是在with限定的范围中搜索,是不是这样理解的

嗯,是的。
cypher 标准的描述是:

Using WITH, you can manipulate the output before it is passed on to the following query parts. The
manipulations can be of the shape and/or number of entries in the result set.
One common usage of WITH is to limit the number of entries that are then passed on to other MATCH
clauses.

你可以参考这个讨论对 WITH 有更基础的理解: cypher-with-clause-semantic

明白,我研究研究,再次感谢:rose:

此话题已在最后回复的 7 天后被自动关闭。不再允许新回复。