nebula支持一次请求返回多个结果吗

在我们的需求中,我们需要查询前10个人的父亲和母亲是谁,返回结果需要为人的姓名,父亲的姓名,母亲的姓名,关系为tag:人——edge:父亲——》tag:人, tag:人——edge:母亲——》tag:人,我们能够通过一个查询获得结果吗?在给定的例子中只可以通过复合查询找到人的父亲、人的母亲,需两个查询语句,虽然可以通过go的两个关系放在一起一个语句,但是我们的请求中可能有些点还需要查询二度关系,比如查询人的父亲姓名、人的母亲姓名,人的母亲的父亲的姓名,在这种情况下能够通过一次查询得到结果吗?

MATCH (v:`人`)-[e:`父亲`|`母亲`]-(v2:`人`)
RETURN v.`人`.name, e.name
2 个赞

你好,我的场景相对复杂一些,比如下图

我需要从绿色的点出发,把所有的 点含有的属性都获得,请问有什么好的方法能一次性都取出吗?
里面包含的关系是: 人-》父亲-》人关联标签 ; 人-》父亲-》人拥有电话号码;人-》拥有身份证;人-》关联标签

不好意思问下,这个 查询语句是执行起来比较慢吗?我们加了limit还需要9秒钟,在我们的库中数据只有不到百万级的节点量


不过测试了下limit的多少好像不是这个查询的瓶颈,请问为啥返回结果特别慢

这里慢的原因 limit 并没有在拓展的过程中产生作用,而是在最后拓展完结果后才做的 limit。这块我们最近确实也在想怎么来优化。

这个是想获取所有的点吗,类似 MATCH (v) RETURN v ?还是说想获取某个点出发的所有一度邻居的属性,类似 MATCH (v)-[]-(v2) WHERE id(v)=='xx' RETURN v2 ?

我们是想展示一个点所有的属性,有些属性是通过和他有关系的其他节点的属性表示,就像我们上面的例子,可能人这个点的属性有5条边的属性都相关,我本来打算使用一个查询语句把这五条线相关的实体都搜索出来,发现这种方式比较复杂,是否分成每条线一个请求结果更好?还是一个请求就可以把结果搜出来?


比如在上图中,我想查询星号的人的邮箱、护照、电话以及电话通联的对象,我是否可以通过一个请求得到?还是得分成3个请求?

match (v:) -[e:拥有护照|拥有邮箱|拥有电话|拥有身份证]-> (v2)-[e2:电话通联]->(v3)<-[e3:拥有电话]-(v4)return e.名称,v2,v3,v4; 这个请求只能都满足情况下才能得到输出

我能想到的是下面的语句,不过可能会多捞一些数据回来:

MATCH (v:人) -[e:拥有护照|拥有邮箱|拥有电话|拥有身份证]-> (v2), (v2)-[e2*0..2]-(v4)
RETURN v, e, v2, e2, v4

还有就是分两次查询:

MATCH (v:人) -[e:拥有护照|拥有邮箱|拥有电话|拥有身份证]-> (v2) RETURN *;
MATCH (v:电话号)-[e2*0..2]-(v4) RETURN *;

有个疑问,像邮箱/护照/电话等跟人的对应关系基本都是1:1,为什么不把这些顶点单独做为人的属性呢?这样的话在查询的时候不就简单了吗?而且像“通联”这种边的建模也可以更简单,只要在通联的边上存一下“电话号” 的属性,就能知道人与人之间通过哪个电话通联了。

其实建模在业务中是很重要的环节,可能会显著影响业务的查询性能和使用方式。就像上面的模型,是不是可以采用类似下面的呢:

人     -----   通联  --------- 人
+邮箱         +电话号          +邮箱
+护照                         +护照
+电话号                       +电话号       

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