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

如何避免重复使用neo4j返回不同的节点和关系

  •  5
  • rayman  · 技术社区  · 10 年前

    我希望返回给定的节点id相关节点及其关系道具

    例如: -> 定义与属性时间戳的双向关系

    1234->777
    777->1234
    1234->999
    999->1234
    1234->888
    888->1234
    

    1234777888999是节点ID

    当我执行此操作时:

        final PreparedStatement ps = conn.prepareStatement("start a = node(1234) match (a)-[k:nearby*]->(b) where a<>b return DISTINCT b, k");        
        ResultSet rs = ps.executeQuery();
        while (rs.next()) {
             Map result = (Map<String, Object>) rs.getObject("b");     
            System.out.println(result.toString());
        }
    
    } catch (SQLException e) {
        e.printStackTrace();
        logger.error("Error returning userId=" + userIdInput, e);
    }
    return null;
    

    }

    我得到:

    {userId=777}
    {userId=999}
    {userId=888}
    {userId=888}
    {userId=999}
    {userId=999}
    {userId=777}
    {userId=888}
    {userId=888}
    {userId=777}
    {userId=888}
    {userId=777}
    {userId=999}
    {userId=999}
    {userId=777}
    
    1. 如何仅获得不同的结果(77788999)
    2. 如何检索1234到dest节点的关系属性?我希望得到 时间戳 在每个关系上定义的属性

    非常感谢。 射线

    2 回复  |  直到 10 年前
        1
  •  3
  •   Brian Underwood    10 年前

    我不知道你在用什么语言,所以我将重点放在Cypher上。首先,我会替换 START 使用查询 MATCH 用一个 WHERE 在…上 ID(a) :

    MATCH (a)-[k:nearby*]->(b)
    WHERE ID(a) = 1234 AND a<>b
    RETURN DISTINCT b, k
    

    其次,我很确定你不需要 a<>b 因为Cypher路径不会在相同节点上循环:

    MATCH (a)-[k:nearby*]->(b)
    WHERE ID(a) = 1234
    RETURN DISTINCT b, k
    

    最后,对于你的问题,我怀疑你得到重复的原因是因为你有多重关系。如果是这样,您可以返回结果节点和一组关系,如下所示:

    MATCH (a)-[k:nearby*]->(b)
    WHERE ID(a) = 1234
    RETURN collect(b), k
    

    这将返回节点/关系对象(两者都具有属性)。根据您的语言/库,您可能会得到“地图”,也可能会得到包装数据的对象

    如果您的库没有为您返回关系的开始/结束节点,您可以执行以下操作:

    MATCH (a)-[k:nearby*]->(b)
    WHERE ID(a) = 1234
    RETURN collect({rel: b, startnode: startnode(b), endnode: endnode(b)}), k
    

    希望这有帮助!

        2
  •  0
  •   Michael Hunger    10 年前

    您会得到不明确的结果,因为您同时返回这两个结果 b k

    如果你只想与众不同 b 的用途:

    MATCH (a)-[k:nearby*]->(b)
    WHERE ID(a) = 1234 AND a<>b
    RETURN DISTINCT b
    

    您还应该使用参数!

    MATCH (a)-[k:nearby*]->(b)
    WHERE ID(a) = {1} AND a<>b
    RETURN DISTINCT b
    
    
    ps.setInt(1,1234);