1

我有一个节点(推特用户)和有向边(跟随)的嵌入式图形数据库。

我正在尝试获取指定用户(节点 U)之后的用户(集合 A)之间的所有关系。A还有 in 中的节点与指定节点之间的关系U

我的查询:

START u=node:user_id(user_id={id_of_U})
MATCH p = u-->following, p2= following-[?]->u, p3 = following-[?]->()<--u
RETURN distinct rels(p),rels(p2),rels(p3) 

这个查询给了我我的期望,但问题是,当指定的用户关注太多用户时,它需要很长时间。

我尝试了很多查询,上面的查询是迄今为止最好的查询。然而,我确信有更有效的方法可以做到这一点,因为当我通过遍历“A”中的所有用户来获取这些关系时,获取每个用户的所有关系(Direction.BOTH),然后过滤与“A”的关系(删除具有不属于“A”的开始或结束节点的关系),跟踪 500 人的用户只需 8 秒,而密码查询甚至不会在不炸毁我的堆的情况下失败...

4

2 回答 2

0

你可以试试这个吗?

start u=node:user_id(user_id={id_of_U})
MATCH u-[r]->following
with u, r, following
match following-[r2?]->u, following-[r3?]->()<-[r4]-u
RETURN distinct r, r2, r3, r4

另外,你用的是最新的1.9吗?

于 2013-02-04T04:49:12.727 回答
0

开始p = u-->following不是最佳选择,因为它需要所有相关节点,然后您尝试过滤这些节点。我建议选择更少的节点,然后稍微扩展一下这个集合:

START u=node:user_id(user_id={id_of_U})
MATCH u-[:FOLLOWS]->following
WITH u,following
MATCH u-[r]-following
RETURN distinct r;

这将为您提供 setA 中节点之间的所有关系,这些节点也由节点 U 跟踪。

如果您的图表中没有关系 FOLLOW - 您应该有,否则您的图表设计不是最佳的。我注意到您在查询中没有使用任何特定的 rel 类型 - 当且仅当您的数据中只有 1 个关系类型时,这可能是最佳的。据我了解您的问题,您有超过 1 种 rel 类型。

编辑:

START u=node:user_id(user_id={id_of_U})
MATCH u-[]-following
WITH u, following
MATCH u-[r]-again, again-[r2]-following
RETURN r, r2
于 2013-02-04T13:06:34.467 回答