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

ray*_*man 5 neo4j cypher

我想返回给定的节点 ID 相关节点及其关系道具

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

1234->777
777->1234
1234->999
999->1234
1234->888
888->1234
Run Code Online (Sandbox Code Playgroud)

1234,777,888,999 是节点 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;
Run Code Online (Sandbox Code Playgroud)

}

我得到:

{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}
Run Code Online (Sandbox Code Playgroud)
  1. 我如何仅获得不同的结果(777,888,999)
  2. 如何检索 1234 到目标节点的关系 props?我希望获得在每个关系上定义的时间戳属性

谢谢你,雷。

Bri*_*ood 3

我不确定你使用的是什么语言,所以我将重点关注 Cypher。首先,我将START用 aMATCH替换WHERE查询ID(a)

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

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

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

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

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

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

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

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

希望这有帮助!