如何避免重复使用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节点?我期望获得在每个关系上定义的时间戳支柱

谢谢,
射线.

最佳答案 我不确定你使用的语言是什么,所以我会专注于Cypher.首先,我将使用带有ID(a)上的WHERE的MATCH替换START查询:

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

希望这有帮助!

点赞