1

に基づいて、約20 万ノードのアプリケーションを開発しています。各ノードには、 アプリケーションの特定のエンティティのようなプロパティtype='user'またはその エンティティを示すプロパティがあります。type='company'グラフ内の特定のタイプのすべてのノードの数を取得する必要があります。

そのプロパティのノードを保持する のusersようなすべてのエンティティのインデックスを作成しました。companiesしたがって、usersインデックス内には130Kノードが存在し、残りはcompanies.

Cypher では、このようにクエリを実行します。

START u=node:users('id:*')
RETURN count(u)

そして結果は

Returned 1 row.Query took 4080ms

サーバーは少し調整してデフォルトとして構成されていますが、4 秒は私たちのニーズには長すぎます。データベースは 1 か月で 20,000 になると考えてください。

おそらくGremlinまたは他のサーバープラグインを使用して、これを行う他の方法はありますか? これらの結果をキャッシュしますが、これを微調整できるかどうか知りたいです。

どうもありがとうございました。私の下手な英語で申し訳ありません。

4

4 に答える 4

3

最後に、Cypher の代わりに Gremlin を使用して、解決策を見つけました。

g.getRawGraph().index().forNodes('NAME_OF_USERS_INDEX').query(
    new org.neo4j.index.lucene.QueryContext('*')
).size()

このメソッドは、lucene インデックスを使用して「近似」行を取得します。

改めて感謝いたします。

于 2012-10-24T03:41:48.807 に答える
1

うーん、これは本当にその Lucene インデックスのパフォーマンスに関するものです。ほとんどの場合、この単一のクエリだけが必要な場合は、どこかのノードの合計数で整数を更新し、インデックスの挿入と一緒に更新してください。適切な測定のために、上記のクエリで毎晩更新を実行してください。 ?

于 2012-08-02T17:27:56.133 に答える
0

代わりに、特定のノードのプロパティをそのようなノードの数で最新の状態に保つことができます。更新は書き込みロックによって保護されます。

トランザクション tx = db.beginTx();
試す {
    ...
    ...
    tx.acquireWriteLock(countingNode);
    countNode.setProperty( "user_count",
        ((Integer)countingNode.getProperty( "user_count" ))+1 );
    tx.success();
} 最後に {
    tx.finish();
}
于 2012-08-02T18:40:47.990 に答える
0

最高のパフォーマンスが必要な場合は、エンティティ カテゴリをノードのプロパティとしてモデル化しないでください。代わりに、次のようにします。

company1-[:IS_ENTITY]->companyentity

または、2.0 を使用している場合

会社1:会社

2 つ目は、別のバックグラウンド スレッドでインデックスを自動的に更新することもできます。これは、2.0 の最高の新機能の 1 つです。

また、最初の方法は、ノードからプロパティを読み取るよりも一般に「ホップ」を行う時間が短いため、より効率的であることを証明する必要があります。ただし、エンティティに対して個別のインデックスを作成する必要があります。

クエリは次のようになります。

v2.0

MATCH company:COMPANY
RETURN count(company)

v1.9

START entity=node:entityindex(value='company')
MATCH company-[:IS_ENTITIY]->entity
RETURN count(company)
于 2013-07-03T10:32:37.030 に答える