2

ユーザーが多くのチームの 1 つに所属したり、お互いに友達になったりできる複雑なユーザー データベースを Neo4j に移行しています。RDBMS でこれを行うのは面倒で時間がかかりましたが、Neo4j を使えば簡単で素晴らしい作業です。:)

クエリする方法があることを望んでいました

  • 1 ホップ離れた関係であり、
  • 2ホップ離れた別の関係

同じクエリから。

START n=node:myIndex(user='345')
MATCH n-[:IS_FRIEND|ON_TEAM*2]-m
RETURN DISTINCT m;

その理由は、友達であるユーザーは互いに 1 つのエッジですが、チームによってリンクされているユーザーはそのチーム ノードを介してリンクされているため、2 つのエッジが離れているためです。このクエリは、IS_FRIEND*2 と ON_TEAM*2 を実行し、チームメイト (yeah) とフレンドのフレンド (boo) を取得します。

単一のクエリで両方の異なる長さの関係を取得する簡潔な方法は Cypher にありますか?

4

2 に答える 2

2

コレクションを返すように書き直しました。

start person=node(1) 
match person-[:IS_FRIEND]-friend 
with person, collect(distinct friend) as friends 
match person-[:ON_TEAM*2]-teammate 
with person, friends, collect(distinct teammate) as teammates 
return person, friends + filter(dupcheck in teammates: not(dupcheck in friends)) as teammates_and_friends

http://console.neo4j.org/r/oo4dvx

サンプルデータベース、Wernerをまとめてくれてありがとう。

于 2013-01-02T19:15:45.327 に答える
1

http://console.neo4j.org/?id=sqyz7iに小さなテスト データベースを作成しました。

あなたが説明したように機能するクエリも作成しました:

START n=node(1) 
MATCH n-[:IS_FRIEND]-m 
WITH collect(distinct id(m)) as a, n 
MATCH n-[:ON_TEAM*2]-m 
WITH collect(distinct id(m)) as b, a
START n=node(*) 
WHERE id(n) in a + b
RETURN n
于 2013-01-02T12:02:00.723 に答える