Neo4j / Cypher :密码查询中有多个匹配的问题



有一些我无法通过密码查询和多重匹配得到的东西。

上下文:

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

me = 节点 (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(因为他是我的朋友)。

确定我在这里做错了什么,但我看不出是什么..您知道我该如何解决我的问题吗?

谢谢

就您的实验而言,第二个模式匹配与"开始"配合使用。因此,您可以将第二个匹配项和第一个匹配项组合为这样的连词,

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"子句的原因,我认为问题是当"用户"和"我"引用同一个节点时,模式变成这样,

(我)-[:联系人]->(x)<-[:联系人]-(我)

为了匹配这样的模式,从"我"开始,它必须遍历相同的关系才能回到"我",但遍历不应该经历相同的关系。因此,如果"我"和"用户"是相同的,那么"我"将不匹配第二个模式。

至于为什么它与"start"子句一起工作,我的猜测是,从两个给定的终点"user"和"me"分别开始,会有两个遍历,两者在中间相遇以测试模式()-[?:IS_FRIEND_WITH*0..3]-(),因此不会再遍历同一关系的问题,因为它们是两个单独的遍历。

最新更新