繁体   English   中英

Neo4j通过一个特定的节点之间的特定关系,所有可到达的节点

[英]Neo4j all reachable nodes thru a specific relationship from a specific node

我想通过一个特定的关系(从一个节点开始)找出所有可到达的节点。

我有以下图表。

(User) --[LOGGED_IN]--> (Ip)
(User) --[FRIEND]--> (User)

我想通过LOGGED_IN关系找到所有可到达的用户节点。 例如。

    user1 logged_in ip1
    user2 logged_in ip1
    user2 logged_in ip2
    user3 logged_in ip2
    user3 logged_in ip3
    user4 logged_in ip3
    user5 logged_in ip4
    user1 friend user5

如果我从user1开始,我想找到user1,user2,user3,user4。 我想忽略朋友关系。

我知道如果我只有[:LOGGED_IN]关系,则可以执行以下密码。 但是我也有FRIEND关系,这也将给我通过[:FRIEND]链接的用户

MATCH (u:User)-[*]->(connected:User)
WHERE u.user_id = <user1_id>
RETURN connected

这应该可以工作(使用<user1_id>的适当值):

MATCH (u:User)-[:logged_in*0..]-(connected:User)
WHERE u.user_id = <user1_id>
RETURN DISTINCT connected;

(u:User)-[:logged_in*0..]-(connected:User)模式:

  • 要求所有匹配的关系的类型为logged_in
  • 指定可变长度路径模式的下限0 ,这允许将u节点本身分配给connected
  • 没有为loggeded_in关系指定方向,以允许从Ip节点到User节点的遍历(反之亦然)。

DISTINCT关键字用于消除重复的结果。

该查询将始终返回u节点(如果存在),因为从其自身可以轻松访问某个节点。

[更新]

如果您有足够的数据,则可变长度路径模式将必须指定一个合理的上限(例如[:logged_in*0..5] ),以避免内存不足或查询花很长时间才能完成。

如果您的节点深度互连,那么单独使用密码可能无法为您解决问题,因为在具有可变长度路径的密码中进行MATCH操作都是为了找到适合该模式的所有可能的路径,这很快使您陷入麻烦。可能的路径穿过屋顶。 当您仅关注不同的连接节点时,这不是一个很好的选择。

如果您有权访问APOC程序,则可以使用一些路径扩展程序来优化查找连接节点的过程。 安装和配置APOC之后,请尝试以下操作:

MATCH (u:User)
WHERE u.user_id = <user1_id>
CALL apoc.path.subgraphNodes(u, {relationshipFilter:'LOGGED_IN', labelFilter:'>User', filterStartNode:true}) YIELD node as connected
RETURN connected;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM