如何忽略 Neo4j.rb 查询中的连接节点
How to neglect connected nodes in Neo4j.rb query
我有一个节点和一个关系
class User
include Neo4j::ActiveNode
property :first_name
end
class Connection
include Neo4j::ActiveRel
include Enumable
creates_unique
from_class 'User'
to_class 'User'
type 'connected_to'
property :status, type: Integer, default: 0
end
我想从尚未与 User1 连接的 User1 中找到二级连接用户
User.find(1).query_as(:s)
.match('(s) - [r1 :connected_to] - (mutual_friend)
- [r2 :connected_to] - (friends_of_friend: `User`)')
.match('(s)-[r4:connected_to]-[friends_of_friend]')
.where('r1.status = 1 AND r2.status = 1 AND r4 IS NULL')
.pluck('DISTINCT friends_of_friend.uuid').count
但是每次我也尝试使用可选匹配时,这都会给我 0 个结果,但它给出了一个巨大的数字,对此有什么帮助吗??
MATCH 不能用于查找模式的缺失,它永远不会 return 行。使用 OPTIONAL MATCH 应该可以。
或者,如果 where_not()
方法允许模式,您可以使用:
.where_not('(s)-[:connected_to]-(friends_of_friend)')
作为排除这种关系的替代方法。
InverseFalcon 是对的,尽管您还可以做其他各种事情来简化它:
class User
include Neo4j::ActiveNode
property :first_name
has_many :both, :connected_users, type: :connected_to, model_class: :User
end
# ActiveRel isn't strictly needed for this,
# though to have the `default` or any other logic it's good to have it
user = User.find(1)
user.as(:user)
.connected_users.rel_where(status: 1)
.connected_users(:friend_of_friend).rel_where(status: 1)
.where_not('(user)-[:connected_to]-(friend_of_friend)')
.count(:distinct)
我认为这也行得通:
user.as(:user)
.connected_users(:friend_of_friend, nil, rel_length: 2).rel_where(status: 1)
.where_not('(user)-[:connected_to]-(friend_of_friend)')
.count(:distinct)
我有一个节点和一个关系
class User
include Neo4j::ActiveNode
property :first_name
end
class Connection
include Neo4j::ActiveRel
include Enumable
creates_unique
from_class 'User'
to_class 'User'
type 'connected_to'
property :status, type: Integer, default: 0
end
我想从尚未与 User1 连接的 User1 中找到二级连接用户
User.find(1).query_as(:s)
.match('(s) - [r1 :connected_to] - (mutual_friend)
- [r2 :connected_to] - (friends_of_friend: `User`)')
.match('(s)-[r4:connected_to]-[friends_of_friend]')
.where('r1.status = 1 AND r2.status = 1 AND r4 IS NULL')
.pluck('DISTINCT friends_of_friend.uuid').count
但是每次我也尝试使用可选匹配时,这都会给我 0 个结果,但它给出了一个巨大的数字,对此有什么帮助吗??
MATCH 不能用于查找模式的缺失,它永远不会 return 行。使用 OPTIONAL MATCH 应该可以。
或者,如果 where_not()
方法允许模式,您可以使用:
.where_not('(s)-[:connected_to]-(friends_of_friend)')
作为排除这种关系的替代方法。
InverseFalcon 是对的,尽管您还可以做其他各种事情来简化它:
class User
include Neo4j::ActiveNode
property :first_name
has_many :both, :connected_users, type: :connected_to, model_class: :User
end
# ActiveRel isn't strictly needed for this,
# though to have the `default` or any other logic it's good to have it
user = User.find(1)
user.as(:user)
.connected_users.rel_where(status: 1)
.connected_users(:friend_of_friend).rel_where(status: 1)
.where_not('(user)-[:connected_to]-(friend_of_friend)')
.count(:distinct)
我认为这也行得通:
user.as(:user)
.connected_users(:friend_of_friend, nil, rel_length: 2).rel_where(status: 1)
.where_not('(user)-[:connected_to]-(friend_of_friend)')
.count(:distinct)