代码之家  ›  专栏  ›  技术社区  ›  James111

我怎么能用cypher返回unmutualcontacts?

  •  0
  • James111  · 技术社区  · 7 年前

    我想返回用户的unmutualContacts(他们不是共同的朋友的联系人)。我想问题可能是:如何返回 结点 那个 用户Y :已连接 有但不回来 结点 那个 用户X :已连接 去。这是一个查询:

    MATCH (o:User { id: y })-[con:CONNECTED]-(users:User)
    MATCH (u:User { id: x })-[ucon:CONNECTED]-(viewerUsers:User)
    WHERE NOT (u)-[:CONNECTED]-(users)
    RETURN users
    

    我想返回连接到的用户 是的 没有连接到 X 是的。我也试过: WHERE NOT (o)-[:PL_CONNECTED]-(viewerUsers) 而不是 NOT (u)-[:CONNECTED]-(users) 一点运气都没有。

    1 回复  |  直到 7 年前
        1
  •  1
  •   InverseFalcon    7 年前

    在这种情况下,使用列表会更容易。我注意到你用的是复数变量名 users viewerUsers ,但它们不表示列表,而是表示每行的单个匹配项。我发现如果您只为列表保留复数变量名会有帮助,这样可以避免一些混淆。

    虽然我们可以使用match和collect()来获取要排除的用户列表,但我们将使用快捷方式并使用模式理解从一行的match中获取列表。一旦我们有了要排除的用户列表,我们就可以在where子句中为 y 以确保我们过滤掉任何应该排除的(因为它们连接到 x )中。

    WITH [(:User { id: x })-[:CONNECTED]-(user:User) | user] as excluded
    MATCH (:User { id: y })-[:CONNECTED]-(user:User)
    WHERE NOT user IN excluded
    RETURN user
    

    或者,您可以通过apoc过程同时执行列表和列表减法:

    WITH [(:User { id: x })-[:CONNECTED]-(user:User) | user] as excluded,
     [(:User { id: y })-[:CONNECTED]-(user:User) | user] as users
    RETURN apoc.coll.subtract(users, excluded) as users
    

    请注意,这个列表只返回一个列表,因此如果您想用一个用户返回多个记录,那么您需要将每个用户放回用户。