我有一个嵌入式节点db(节点用户)和有向边(后跟)。
我正在尝试获取指定用户(节点U)后面的用户(集A)之间的所有关系。此外,A
中的节点与指定节点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”中的所有用户获取java方法中的这些关系时,获取每个用户的所有关系(Direction.BOTH),然后使用“A”过滤关系(删除具有不属于“A”的起始节点或结束节点的关系),对于追随500人的用户,仅需8秒,而密码查询甚至不能在不鼓励我的堆的情况下失败......
答案 0 :(得分: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吗?
答案 1 :(得分: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种类型。
修改强>
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