Neo4J的Facet字段,例如Solr



我正在使用PHP内置的社区电子商务和使用REST接口。

我需要获得与亚马逊这样的搜索结果相关的所有类别。此功能可在其他引擎(例如Solr(Lucene的另一个实现))中获得,例如 faceted search

如何在neo4j中进行 faceted搜索?或重新创建此功能的最佳方法(性能等级)是什么?

与此功能相关的所有必需模块都从Neo4J的核心包中排除。我想知道是否有人尝试执行这样的操作,而不会横向图中的所有节点,抓住一些属性,然后进行组合。如果我们有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();

您的域模型呢?您只是把所有内容都放在索引中吗?通常,您会将类别建模为节点,并使您的产品与类别节点相关。

(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(*)

最新更新