2

Spring と Neo4j データベースを使用してプロジェクトに取り組んでいます。Neo4j データベースを rest neo4j に構成しました。これは構成です:

<neo4j:config graphDatabaseService="graphDatabaseService" />
<bean id="graphDatabaseService" class="org.springframework.data.neo4j.rest.SpringRestGraphDatabase">
    <constructor-arg index="0" value="http://localhost:7474/db/data" />
</bean>

最初は、ノードと関係を保存するために、ドメイン オブジェクト ( 、 など) とリポジトリの表記を使用していまし@NodeEntity@RelatedTo。私のドメイン オブジェクトは、ユーザー(ID、名前)、アイテム(ID、名前、説明、用語のリスト)、用語(コンテンツ、カウント) です。そのため、そこにはそれほど多くのプロパティはありませんが、それでも、リポジトリを介してオブジェクトを保存します。たとえば、定義された id と名前を持つユーザーは25 秒間続きました。

この種の neo4j データベースとの通信はまだ十分に最適化されていないことを読んだので、 Neo4jTemplate を使用して切り替えました

これはユーザーを保存する例です (ユーザーの制約は文字列 ("id", "name", "USER") です):

public Node saveUser(User user) {
    Node node = template.createNode();
    node.setProperty(User.ID, user.getId());
    node.setProperty(User.NAME, user.getName());
    node.setProperty("_type", User.LABEL);

    template.index(INDEX_ID, node, User.ID, user.getId());
    return node;
}

これは、用語との関係とともにアイテムを保存する例です。したがって、各用語はアイテムに接続されているノードです。

public Node saveItem(Item item) {
    Node node = template.createNode();
    node.setProperty(Item.ID, item.getId());
    node.setProperty(Item.NAME, item.getName());
    node.setProperty(Item.DESCRIPTION, item.getDescription());
    node.setProperty("_type", Item.LABEL);

    template.index(INDEX_ID, node, Item.ID, item.getId());

    for(String termContent : item.getTerms()) {
        Node term = termRepository.getNodeByContent(termContent);
        if(term == null) {
            term = termRepository.saveTerm(new Term(termContent));
        } else {
            termRepository.addCountToTerm(term);
        }

        int frequency = 1;          

        Relationship contains = node.createRelationshipTo(term, RelationshipTypes.CONTAINS);
        contains.setProperty(Term.FREQUENCY, frequency);            
    }
    return node;
}

オブジェクトtermRepository(拡張されていないGraphRespository<Term>) には、ユーザーを保存する方法と同様の方法があります。用語の取得は次のように行われます。

public Node getNodeByContent(String content) {
    if(!template.getGraphDatabaseService().index().existsForNodes(INDEX_ID))
        return null;
    return template.lookup(INDEX_ID, Term.CONTENT, content).to(Node.class).singleOrNull();
}

そして、最後に私の問題は何ですか。今でもまだ遅く、ユーザーの挿入(パラメーターIDと名前のみ)とインデックス作成には3秒かかり、用語に接続されているアイテムの挿入には30秒かかります(4つの用語の場合-これは非常に少ない量です私が実際に持っている60-70の数)。

この種の問題で私を助けることができる何かヒントや何かを教えてください。前もって感謝します。

4

1 に答える 1

3

サーバーはどこで実行されていますか? ネットワーク設定に問題があるようです。

SDN over REST は高速ではありませんが、それほど遅くもありません。

クラスも共有できますか?

ネットワーク経由で個々のプロパティの更新を行うべきではありません。一度にすべてのプロパティを作成するサイファー ステートメントを使用します。

これを 1 つの操作として実行する neo4jTemplate.createNode(map of properties) もあります。

于 2013-06-20T10:52:16.857 に答える