[英]Neo4j cypher query to get all nodes without a relationship to specific other node
[英]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.