我在使用PHP构建的社区电子商务中使用Neo4j并使用REST界面。
我需要获取与搜索结果相关的所有类别,例如亚马逊。此功能在Solr(Lucene的另一个实现)等其他引擎中可用作Faceted Search
如何在Neo4j中进行分面搜索?或者重建此功能的最佳方式(性能等级)是什么?
与此功能相关的所有必需模块都不包含在neo4j的核心包中。我想知道是否有人尝试做这样的事情而不横向图中的所有节点,抓住一些属性,并创建这个值的groupCount。如果我们有200k节点,则横向需要10秒才能获得类别。
这是我的Gremlin方法。
(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();
答案 0 :(得分: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(*)