1

私はNeo4jとグラフデータベースを初めて使用しますが、リレーショナルデータベースのバックグラウンドを持っています。

私の質問は、Neo4jでSQLServerクエリを効率的に複製する方法についてのアドバイスを求めるものです。

たくさんの友達同士の関係を保存する必要があるため、Neo4jに適していると思う新しいプロジェクトを開始しています。Neo4j 1.8.1とC#を使用してアプリケーションを作成しています

私のプロジェクトの一部には、Twitterに匹敵する構造のセクションがあり、ここで助けが必要です。

Twitterの例えを使用して、問題を説明します。

テキストブロブ(ツイート)のリストがあり、各ブロブは0、1、または多くのカテゴリ(ハッシュタグ)に分類できます。Twitterとは異なり、0、1、または多くのカテゴリにリンクされているユーザーもいます。

私はグラフが次のように見えると思います:

T =テキストブロブノード、C =カテゴリノード、U=ユーザーノード

T-------C-------U
 \_____/ \_____
 /     \       \
T-------C-------U
 \_____
       \
T-------C-------U
  _____/ \_____
 /             \
T               U

アプリケーションの実行中は、約10,000,000レコード(おそらくこれ以上アーカイブする予定です)、約100のカテゴリ、および約1000のユーザーが存在すると推定されます。

現在、これをテストするための単純なSQLServerデータベースがあります。

     __________ ______________ ___________ ______________ ________
    |テキスト| | TextCategory | |カテゴリ| | UserCategory | |ユーザー|
    | ---------- | | -------------- | | ----------- | | -------------- | | -------- |
    | TextId | ------- | TextId | ------ | CategoryId | ----- | UserId | ---- | UserId |
    |テキスト| | CategoryId | |名前| | CategoryId | |名前|
    |日付追加| |日付追加| | ----------- | | -------------- | | -------- |
    | ---------- | | -------------- |

DateAddedフィールドをTextテーブルからTextCategoryテーブルにコピーし、2つのリンクテーブルにインデックスを追加することで、次のクエリを実行して、ユーザーがサブスクライブしているカテゴリに属する​​すべてのテキストアイテムを日付順に返すことができます。

SELECT t.*
FROM Text t
    INNER JOIN tc TextCategory ON tc.TextId = b.TextId
WHERE tc.CategoryId IN
(
    SELECT CategoyId
    FROM UserCategory
    WHERE UserId = @UserId
)
ORDER BY tc.AddedDate 

実際には結果をページングしますが、簡単にするために、これは省略しました。

このクエリをNeo4jデータベースに効率的に複製するにはどうすればよいですか?このようなサブクエリはCypherで可能ですか?

私がこのようなものを使用した場合:

u-[:SUBSCRIBES_TO]->c<-[:BELONGS_TO]-t

(私のサイファースキルはまだかなり幼稚です)

テキストノードをスキャンすることはできましたが、ユーザーのインデックスを使用することはできませんでした。最終的に、各テキストノードをチェックして、ユーザーにリンクされているかどうかを確認します。

ユーザーにリンクされているすべての関係をスキャンした場合、テキストノードの日付順インデックスを利用して結果をページングすることはできません。たとえば、すべてのノードをスキャンして最も早い10を見つけることは避けてください。

私が述べたように、私はRDBMSのバックグラウンドから来ており、リレーショナルデータベースの方法でこれについてまだ考えています。したがって、私の理論が間違っている場合は、私に知らせてください。

4

1 に答える 1

3

これは、neoに直接変換されると思います。ユーザーノードをインデックスに入れて、すでに述べたようにクエリを実行できます。

start u=users(<USERID>) match u-[:SUBSCRIBES_TO]->c<-[:BELONGS_TO]-t return t order by t.AddedDate skip(<SKIPPED>) limit(<PAGESIZE>)

私が何かを逃さない限り、あなたはすでにそれに答えました。

于 2013-03-01T14:18:01.357 に答える