2013-10-31 55 views
0

有些事情我没有通过密码查询和多个匹配得到。Neo4j/Cypher:在密码查询中出现多个匹配问题

语境:

目标=节点(2145)=视频游戏上的应用程序

我=节点(2570)=用户登录

我试图让所有的与给定目标交互的用户(包括我)。 此外,我希望这些用户按照他们和我之间的距离排序......

即,其目标是显示与视频游戏互动的用户:我和我的朋友,然后是其他人。

我的查询:

START target=node(2145), me=node(2570) 
MATCH (target)-[:INTERACTIONS]->()<-[:IS_TARGET_OF]-(interactions)<-[:IS_SOURCE_OF]-()<-[:INTERACTIONS]-(users) 
WITH me, users 
MATCH p = (users)-[:CONTACTS]->()-[?:IS_FRIEND_WITH*0..3]-()<-[:CONTACTS]-(me) 
RETURN users, MIN(LENGTH(p)) as conn 
ORDER BY conn ASC 

问题:

考虑,我与目标交互的唯一一个,我应该得到一个结果:2570

我遇到的问题是我在返回的用户中看不到'我':查询不会返回任何内容

我的尝试:

  • 如果我第一场比赛之后回来,我得到一个结果:2570
  • 如果在第二场比赛,我尝试P =(用户) - [* 0..3] - (我),我也得到一个结果:2570

  • 如果我只需要在查询的第二部分尝试以下操作:

    START me=node(2570), users=node(2570, 2802) 
    MATCH p = me-[:CONTACTS]->()-[?:IS_FRIEND_WITH*0..3]-()<-[:CONTACTS]-(users) 
    RETURN users, MIN(LENGTH(p)) as conn 
    ORDER BY conn ASC 
    

    我得到2570和2802(因为他是我的朋友)。

我确定我在这里做错了什么,但我看不到什么......你有什么想法我可以解决我的问题吗?

感谢,

回答

1

在您的实验方面,第二模式与之相匹配的“启动”工作正常。所以,你可能只是相结合的第二场比赛和第一场比赛是这样的结合,

START target=node(2145), me=node(2570) 
MATCH (target)-[:INTERACTIONS]->()<-[:IS_TARGET_OF]-(interactions)<-[:IS_SOURCE_OF]-()<-[:INTERACTIONS]-(users), p = (users)-[:CONTACTS]->()-[?:IS_FRIEND_WITH*0..3]-()<-[:CONTACTS]-(me) 
RETURN users, MIN(LENGTH(p)) as conn 
ORDER BY conn ASC 

应该返回节点“我”作为结果。

至于为什么第二图案不符合“与”条款,我认为这个问题是当“用户”和“我”指的是同一节点,图案变得喜欢这个工作的原因,

(箱) - [:CONTACTS] - >(x)的< - [:CONTACTS] - (我)

要匹配这样的模式,从 “我” 开始,它必须遍历到相同的关系回到“我”,但导线不应该经历同样的关系。所以如果“我”和“用户”是相同的,那么“我”就不会匹配第二个模式。

至于为什么它与“开始”条款一起工作,我猜测会有两个遍历从两个给定的终点“用户”和“我”分开开始,而两个会在中间相遇以测试pattern() - [?: IS_FRIEND_WITH * 0..3] - (),所以不会再出现两次遍历相同关系的问题,因为它们是两个独立的遍历。

+0

非常感谢Lisa,我用你的查询结合了第二场比赛和第一场比赛,这完美地奏效了。再一次,你的解释很清楚,谢谢! – Brice