2016-04-24 21 views
1

にneo4j.rbでn番目レベルの友人を探し、私はそれぞれuser1user2 USER_ID 1及び2を作成した双方向関係グラフ

class User 
    include Neo4j::ActiveNode 
    include Neo4j::Timestamps 
    property :user_id, type: Integer, constraint: :unique 
    property :max_friends_count, type: Integer, default: 5 
    validates :user_id, :presence => true 
    has_many :out, :followings, model_class: :GraphUser, rel_class: :GraphRel, unique: true 
    has_many :in, :followers, model_class: :GraphUser, rel_class: :GraphRel, unique: true 
end 

以下のように定義されたユーザークラスを有しています。

次に、 user1.followings(rel_length: 2)を使用して以下の検索を行います。しかしuser1として結果が出てくるのは、user1user2の両方がお互いに続いているからです。

私はorder(:breadth_first)と他の方法を試して、すでに訪れたノードを除外しました。私は十分な研究をしていないかもしれませんが、誰にどのようにこれを行うか考えているのですか?

答えて

1

まず、id_propertyを使用します。 user_idpropertyを使用し、constraint: :uniqueと設定すると、自動的にuuidプロパティが生成されます。それはあなたが望むものかもしれませんが、頭を上げるだけです。ここでid_propertyのドキュメントがあります:

https://github.com/neo4jrb/neo4j/wiki/Neo4j-v3-Unique-IDs

あなたの質問に、あなたのコードは、これにサイファー同様の生成(私はmodel_classrel_classオプションを変更するために必要な):

シングル MATCH句で
MATCH user15573 
WHERE (ID(user15573) = {ID_user15573}) 
MATCH user15573-[rel1:`FOLLOWS`*2]->(result_followings:`User`) 

Cypherでは、Neo4jは単一パスのトラバーサルに対して同じ関係が複数回トラバースされないようにします。しかし、彼らがお互いに従っているということは、元のユーザーに戻るために他の関係に従うことができるということを意味します。それはあなたが潜在的な結果から、元のユーザーを除外する必要があるだろうことができます。

MATCH user15573 
WHERE (ID(user15573) = {ID_user15573}) 
MATCH user15573-[rel1:`FOLLOWS`*2]->(result_followings:`User`) 
WHERE result_followings <> user15573 

はRubyでは、これは次のようになります。

user1.as(:source).followings(:target, nil, rel_length: 2).where('source <> target') 
関連する問題