Neo4j.rb 分别查询两个关系的进出
Neo4j.rb query in and out separately for both relationship
这是我的 Neo4j 模型
class User
include Neo4j::ActiveNode
has_many :both, :followers, type: :following, model_class: 'User'
end
用户 1 有 2 出和 1 入喜欢关注
user1 ---> user2
user1 ---> user3
user1 <--- user3
如果我查询喜欢关注它 returns 两个 in/out
user1.followers.count #returns 3
我想分别查询 in 和 out 以获得 User
我如何使用 Neo4j.rb..
提前致谢。
由于关联规定了匹配 Cypher 的编写方式,因此您不能在调用该方法以更改其行为时覆盖该方法。解决方案是再创建两个关联。
class User
include Neo4j::ActiveNode
has_many :both, :followers, type: :following, model_class: 'User'
has_many :out, :following, type: :following, model_class: 'User'
has_many :in, :followed_by, type: :following, model_class: 'User'
end
end
# Or, to make it feel more Ruby...
class User
include Neo4j::ActiveNode
[[:both, :followers], [:out, :following], [:in, :followed_by]].each do |dir, assoc|
has_many dir, assoc, type: :following, model_class: 'User'
end
end
2.2.0 :008 > User.followers.to_cypher
=> "MATCH (node2:`User`), (result_followers:`User`), node2-[rel1:`following`]-(result_followers:`User`)"
2.2.0 :009 > User.following.to_cypher
=> "MATCH (node2:`User`), (result_following:`User`), node2-[rel1:`following`]->(result_following:`User`)"
2.2.0 :010 > User.followed_by.to_cypher
=> "MATCH (node2:`User`), (result_followed_by:`User`), node2<-[rel1:`following`]-(result_followed_by:`User`)"
这是我的 Neo4j 模型
class User
include Neo4j::ActiveNode
has_many :both, :followers, type: :following, model_class: 'User'
end
用户 1 有 2 出和 1 入喜欢关注
user1 ---> user2
user1 ---> user3
user1 <--- user3
如果我查询喜欢关注它 returns 两个 in/out
user1.followers.count #returns 3
我想分别查询 in 和 out 以获得 User
我如何使用 Neo4j.rb..
提前致谢。
由于关联规定了匹配 Cypher 的编写方式,因此您不能在调用该方法以更改其行为时覆盖该方法。解决方案是再创建两个关联。
class User
include Neo4j::ActiveNode
has_many :both, :followers, type: :following, model_class: 'User'
has_many :out, :following, type: :following, model_class: 'User'
has_many :in, :followed_by, type: :following, model_class: 'User'
end
end
# Or, to make it feel more Ruby...
class User
include Neo4j::ActiveNode
[[:both, :followers], [:out, :following], [:in, :followed_by]].each do |dir, assoc|
has_many dir, assoc, type: :following, model_class: 'User'
end
end
2.2.0 :008 > User.followers.to_cypher
=> "MATCH (node2:`User`), (result_followers:`User`), node2-[rel1:`following`]-(result_followers:`User`)"
2.2.0 :009 > User.following.to_cypher
=> "MATCH (node2:`User`), (result_following:`User`), node2-[rel1:`following`]->(result_following:`User`)"
2.2.0 :010 > User.followed_by.to_cypher
=> "MATCH (node2:`User`), (result_followed_by:`User`), node2<-[rel1:`following`]-(result_followed_by:`User`)"