2013-02-04 121 views
0

我有一个节点(Twitter用户)和有向边(嵌入式图形数据库)。得到一个节点的邻居之间的所有关系

我试图让用户(集合A)之间的所有关系都跟随一个指定的用户(节点U)。还有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

你可以试试这个吗?

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?

+0

我用的是1.8.1,但现在已经升级到1.9,并试图您的查询,但没有改变... – cagdas

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; 

这会给你在组A节点之间的所有关系,谁也通过节点U. folowed

在如果你没有关系在你的图表中 - 你应该有,否则你的图形设计不是最优的。我注意到你在查询中没有使用任何特定的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 
+0

您的查询只给u'和''之间的关系以下'...我想要的是也得到'following [m]'-'following [n]'之后的所有关系,其中'[m]'和'fol​​lowing [n]'后面的是集合'A'的元素。这是我无法处理的棘手部分。 (顺便说一句,我的图有一种关系,关注) – cagdas

+0

thx,我已经更新了我的答案,关键是将setA两次匹配成两个不同的变量,然后匹配这些变量之间的rels。如果这仍然会达到你堆的限制,恐怕唯一的办法就是使用gremlin并严格定义算法。 – ulkas

+0

实际上,您提出的查询会导致堆错误,但添加一个“WITH”可解决该问题。 'START u = node:user_id(user_id ='109537107')MATCH u - [] - >跟随着u,跟在MATCH u- [r] - >之后再次跟随,再次r MATCH - [r3] - >跟随但是,我做了另一个实现,首先得到'u'所遵循的所有节点的id。然后将它们作为参数传递两次,例如'START u = node({nodeIdList}),u2 = node({nodeIdList2})MATCH u- [r] - > u2,u2- [r2] - > u RETURN distinct r,r2'这提供了最快的解决方案。也许我们应该等待新版本的neo4j ... – cagdas

相关问题