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

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

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

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

1234,777,888,999是node-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}
  • 我如何才能得到明显的结果(777,888,999)

  • 如何检索1234的关系道具到dest节点?我期望获得在每个关系上定义的 timestamp 道具

雷,谢谢你 .

回答(2)

3 years ago

我'm not sure what language you'正在使用,所以我将专注于Cypher . 首先,我将 START 替换为 MATCHWHEREID(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

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

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

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

希望这有帮助!

3 years ago

你得到非截然不同的结果,因为你同时返回 bk

如果您只是想要明确 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);