获取节点的邻居之间的所有关系

时间:2013-02-04 02:44:48

标签: performance neo4j cypher

我有一个嵌入式节点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秒,而密码查询甚至不能在不鼓励我的堆的情况下失败......

2 个答案:

答案 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