0

友人関係に Neo4J を使用する利点を確認するために、MySQL データベースに Persons ("Persons"、20900 データセット) 用の 1 つのテーブルを作成しました。

id     | name
--------------
 1     | Peter
 2     | Max
 3     | Sam
 ...   | ...
 20900 | Rudi

関係 (「Friendships」、50 から 100 の友人を持つ各人) の 1 つのテーブル:

personen_id_1 | personen_id_2
-------------------------
 1         | 2
 1         | 3
 2         | 56
 ...       | ...
 20900     | 201

したがって、約120万の関係があります。

ここで、id=1 の Person の友達の友達の友達の友達を探したいので、次のようなクエリを作成しました。

select distinct P.name
from Friendships f
join Friendships f2 ON f.personen_id_2 = f2.personen_id_1
join Friendships f3 ON f2.personen_id_2 = f3.personen_id_1
join Friendships f4 ON f3.personen_id_2 = f4.personen_id_1
join Persons P ON f4.personen_id_2 = P.id
where f.personen_id_1 = 1

user-id 1 のクエリには約 30 秒かかりました

Neo4J では、1 つの名前プロパティを持つ 1 つのノード (20900 ノード) を各人に作成しました。すべてのノードは MySQL の Friendship テーブルに等しく接続されているため、120 万の関係があります。

ここで同じ frinedset を取得するために、gremlin を入力しました。

gremlin> g.v(1).outE.inV.loop(2){ it.loops <= 4 }.name.dedup.map()

これには約1分かかりました。私はこれをまったく期待していませんでした!

私の比較は正しいですか?はいの場合、この例を変更して、このタスクにneo4jを使用する利点を示すにはどうすればよいですか?

4

2 に答える 2

1

4 つのループを実行していることがわかっている場合は、次のようにします。

g.v(1).out.out.out.out.name.dedup.map

Gremlin には既知のセマンティック バグがあり、loop() は幅優先クエリになります。 https://github.com/tinkerpop/pipes/issues/25

また、必要がなければ outE.inV を実行しないでください。同等品が出ています。また、大規模な計算 (組み合わせ爆発) である 4 ステップの検索を行っていることに注意してください。これは、グラフ データベースが苦手とするものです。これについては、Faunus のようなバッチ分析フレームワーク ( http://thinkaurelius.github.com/faunus/ ) を参照してください。理由については、http://thinkaurelius.com/2012/04/21/loopy-lattices/を参照してください。

グラフ データベースは、ローカル トラバーサル用に最適化されています。4 つのステップで、データセット全体にアクセスし (おそらく)、"get get get" スタイルのデータベース アクセスを使用すると、効率的ではありません。

HTH、マルコ。

于 2012-12-11T23:19:35.757 に答える
0

私は Gremlin にあまり詳しくありませんが、同様のサイズのデータ​​セット (以下の統計) を生成し、Cypher で同等のクエリを実行しました。

START person=node:user(name={name})
MATCH person-[:FRIEND]-()-[:FRIEND]-()-[:FRIEND]-()-[:FRIEND]-friend
RETURN friend.name AS name

データセットに対してこれを 1000 回実行し、毎回異なるユーザーを開始点として選びました。テストを実行する前にキャッシュをウォームアップしなかったため、これはスタンディング スタートからのものです。平均応答時間: 33 ミリ秒。

MacBook Pro、2.2 GHz Intel Core i7、8 GB RAM、4 GB ヒープで実行

グラフの統計は次のとおりです。

+----------------------------------------------+
| user           | 20900                       |
+----------------------------------------------+
|                | Average |    High |     Low |
+----------------------------------------------+
| FRIEND                                       |
+----------------------------------------------+
|       OUTGOING |      74 |     100 |      48 |
|       incoming |      74 |     123 |      31 |
+----------------------------------------------+

+----------------------------------------------+
| _UNKNOWN       | 1                           |
+----------------------------------------------+
|                | Average |    High |     Low |
+----------------------------------------------+

+----------------------------------------------+
| Totals                                       |
+----------------------------------------------+
| Nodes          | 20901                       |
| Relationships  | 1565787                     |
+----------------------------------------------+
| FRIEND         | 1565787                     |
+----------------------------------------------+
于 2012-12-11T19:23:23.887 に答える