我想返回给定的节点 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)
谢谢你,雷。
我不确定你使用的是什么语言,所以我将重点关注 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)
希望这有帮助!
归档时间: |
|
查看次数: |
5153 次 |
最近记录: |