4

PHP で構築されたコミュニティ e コマースで Neo4j を使用し、REST インターフェイスを使用しています。

Amazon のような検索結果に関連するすべてのカテゴリを取得する必要があります。この機能は、Solr (Lucene の別の実装) などの他のエンジンでファセット検索として利用できます。

Neo4jでファセット検索を行うにはどうすればよいですか? または、この機能を再現する最善の方法 (パフォーマンス グレード) は何ですか?

この機能に関連するすべての必須モジュールは、neo4j のコア パッケージから除外されます。誰かがグラフ内のすべてのノードを横断せずにこのようなことを試み、いくつかのプロパティを取得し、この値の groupCount を作成しようとしているかどうかを知りたいです。200,000 個のノードがある場合、横断はカテゴリを取得するだけで 10 秒かかりました。

これが私のグレムリンのアプローチです。

(new Neo4jVertexSequence(
    g.getRawGraph().index().forNodes('products').query(
        new org.neo4j.index.lucene.QueryContext('category:?')
    ), g
))._().groupBy{it.category}.cap.next();

結果は 90 行になり、54 秒かかりました。

Books = 12002
Movies_Music_Games = 19233
Electronics_Computers = 60540
Home_Garden_Tools = 9123
Grocery_Health_Beauty = 15643
Toys_Kids_Baby = 15099
Clothing_Shoes_Jewelry = 12543
Sports_Outdoors = 10342
Automotive_Industrial = 9638
... (more rows)

もちろん、これは「非入力検索」のためなので、この結果をキャッシュに入れることはできません。ユーザーが「Iphone」のようなクエリを作成すると、クエリは次のようになります

(new Neo4jVertexSequence(
    g.getRawGraph().index().forNodes('products').query(
        new org.neo4j.index.lucene.QueryContext('search:"iphone" AND category:?')
    ), g
))._().groupBy{it.category}.cap.next();
4

1 に答える 1

0

ドメイン モデルはどうですか? すべてをインデックスに入れましたか?通常、カテゴリをノードとしてモデル化し、製品をカテゴリ ノードに関連付けます。

(product)-[:HAS_CATEGORY]->(category)<-[:IS_CATEGORY]-(categories)

クエリでは、この小さなツリーをたどって、各カテゴリ ノードから始まる :HAS_CATEGORY タイプの関係を数えるだけです。

start categories=node(x)
match (product)-[:HAS_CATEGORY]->(category)<-[:IS_CATEGORY]-(categories)
return category.name, count(*)
于 2012-10-28T03:14:35.917 に答える