0

Neo4j 2.0.1 を使用して、ユーザーとまだ友達ではない友達の友達を任意のレベル (2-5) の深さで見つけようとしています。

最初は、友人のすべての友人を取得するために cypher を使用していましたが、悲しいことに、深さ 4 と 5 で友人の友人を見つけようとすると、パフォーマンスが非常に悪くなりました。 Neo4jPHP トラバーサル。だから、これは私が行った変更です:

ノート:

- there are 10 users with 5 friends of each user
- user that I want to traverse at depth of 3 is 1
- traversal at depth of 3

友達リスト:

User | Friends
 1   | 9,2,8,7,5
 2   | 1,6,3,8,10
 3   | 5,7,1,10,2
 4   | 3,10,6,9,5
 5   | 4,8,1,9,3
 6   | 7,9,3,2,10
 7   | 9,5,10,6,8
 8   | 6,9,1,10,5
 9   | 6,5,10,1,8
 10  | 8,6,4,5,9

サイファー:

MATCH (U:User)-[F:Friend]->(FU:User)-[FF:Friend]->(FFU:User)
WHERE U.user_id=1
WITH DISTINCT U, FFU
WHERE FFU<>U 
WITH DISTINCT U, FFU
MATCH (FFU:User)-[FFF:Friend]->(FFFU:User)
WHERE FFFU<>U AND NOT (U)-[:Friend]->(FFFU)
RETURN DISTINCT FFFU.username;

Travesal Rest Api[更新]:

POST http://localhost:7474/db/data/node/1/traverse/node
{
  "order" : "breadth_first",
  "uniqueness" : "node_global",
  "prune_evaluator" : {
    "name" : "none",
    "language" : "builtin"
  },
  "return_filter" : {
    "body" : "position.endNode().getProperty('user_id')!=1 && position.endNode().getProperty('user_id')!=9 && position.endNode().getProperty('user_id')!=2 && position.endNode().getProperty('user_id')!=8 && position.endNode().getProperty('user_id')!=7 && position.endNode().getProperty('user_id')!=5;",
    "language" : "javascript"
  },
  "relationships" : {
    "direction" : "out",
    "type" : "Friend"
  },
  "max_depth" : 3
}

Neo4jPHP トラバーサル[更新]:

$traversal->addRelationship('Friend', Relationship::DirectionOut)
    ->setPruneEvaluator(Traversal::PruneNone)
    ->setReturnFilter('javascript', "position.endNode().getProperty('user_id')!=1 && position.endNode().getProperty('user_id')!=9 && position.endNode().getProperty('user_id')!=2 && position.endNode().getProperty('user_id')!=8 && position.endNode().getProperty('user_id')!=7 && position.endNode().getProperty('user_id')!=5;")
    ->setMaxDepth(3)
    ->setUniqueness(Traversal::UniquenessNodeGlobal)
    ->setOrder(Traversal::OrderBreadthFirst);

上記の Traversal Rest Api と Neo4jPHP Traversal を使用すると、次の結果が得られました。9,6,7,3,2,10,5,4,8

私が望む結果は次のとおりです。6,3,10,4

9,7,2,5,8すでにユーザーと友達であるため:1

ノート:

I just updated the way I traverse my graph to find friends of friends at depth of 3, so I updated my question too.

return_filter で作成した条件は手動であることがわかります。

"body" : "position.endNode().getProperty('user_id')!=1 && position.endNode().getProperty('user_id')!=9 && position.endNode().getProperty('user_id')!=2 && position.endNode().getProperty('user_id')!=8 && position.endNode().getProperty('user_id')!=7 && position.endNode().getProperty('user_id')!=5;"

1Cypher では、すでに user :と友達になっている友達の友達を簡単に削除できます。

WHERE NOT (U)-[:Friend]->(FFFU)

では、Traversal Rest Api でそのような条件を作成するにはどうすればよいでしょうか。

ドキュメントからの情報があまりないので、私は尋ねます。

誰か助けてください。私は本当にあなたの助けが必要です。

ありがとうございました。

4

1 に答える 1