我无法通过密码查询和多次匹配得到一些东西。
背景:
target = node(2145)=应用中的视频游戏
me = node(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。
我遇到的问题是我在返回的用户中看不到“我”:查询没有返回任何内容
我尝试了什么:
如果,在第二场比赛中,我尝试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(因为他是我的朋友)。
我确定我在这里做错了什么,但我看不出什么......你知道我怎么能解决我的问题吗?
谢谢,
答案 0 :(得分: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
那应该返回节点“me”作为结果。
至于第二种模式不能与“With”子句一起工作的原因,我认为问题是当“用户”和“我”引用同一个节点时,模式变得像这样,
(me) - [:CONTACTS] - &gt;(x)&lt; - [:CONTACTS] - (我)
为了匹配这样的模式,从“我”开始,它必须遍历相同的关系才能回到“我”,但是遍历不应该通过相同的关系。因此,如果“我”和“用户”相同,则“我”与第二个模式不匹配。
至于为什么它与“start”子句一起使用,我猜测会有两个遍历分别从两个给定的结束点“users”和“me”开始,两者在中间相遇以测试模式() - [?: IS_FRIEND_WITH * 0..3] - (),因此不再存在遍历相同关系的问题,因为它们是两个单独的遍历。