Neo4j Facet 字段,如 Solr

标签 neo4j faceted-search gremlin

我在用 PHP 构建的社区电子商务中使用 Neo4j 并使用 REST 接口(interface)。

我需要获取与亚马逊等搜索结果相关的所有类别。此功能在 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();

最佳答案

你的领域模型呢?你把所有东西都放在索引里了吗?通常,您会将您的类别建模为节点,并将您的产品与类别节点相关联。

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

关于Neo4j Facet 字段,如 Solr,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13043022/

相关文章:

python - Gremlin Python - "Server disconnected - please try to reconnect"错误

java - Spring Data Neo4j @GraphId 和 @Index

java - 在Java SpringBoot中,可以有一个通用的起始节点并稍后分配类型吗?

solr - Apache Solr 中构面字段的层次结构(不是层次结构构面)?

mysql - 如何获取每个产品属性/过滤器的总数,如 newegg

elasticsearch - ElasticSearch日期字段统计

Gremlin - 根据组键选择顶点

Azure Cosmos 图形数据库支持 Gremlin 和 Tinkerpop 版本

python - 如何在 Neo4j python-embedded 中附加一个列表?

neo4j - 删除旧关系并在同一查询中创建具有相同标签的新关系