Neo4j Cypher - 按公共输入节点过滤节点未解决
Neo4j Cypher - Filtering nodes by Input nodes in common Doesn't resolve
我有一个大型数据库 >100 万客户,>100k 产品
我正在尝试根据实时数据构建产品推荐。但是,我构建的第一个查询从未解决。 (或者至少我在 30 分钟后停止)
我想输入一个客户并获取他们购买的产品的所有使用情况。然后我想获得所有具有相同用途和更多用途的客户。 (我本来打算做之后的事情,但无法通过这部分)
所有节点都按唯一 ID 编入索引。
MATCH (c:customer {customer_id:'0c4c518e5d1eaf3fc39f93463c2406ad8b659d6c22c9107179e3992f647b12aa'})-[:PURCHASE]->(p:product)-[:HAS]->(u:use)
WITH DISTINCT(u.section_id) as uses
MATCH (ac:customer)-[:PURCHASE]->(ap:product)-[:HAS]->(au:use)
WHERE au.section_id in uses
RETURN ac
我构建了一个执行完整推荐的新查询。但仍然需要1分钟......
我认为问题是我正在匹配 :use 然后返回,这一定是有太多节点需要排序。
MATCH (c:customer {customer_id:'0c4c518e5d1eaf3fc39f93463c2406ad8b659d6c22c9107179e3992f647b12aa'})-[:PURCHASE]->(p)<-[:PURCHASE]-(oc)
MATCH (u:use)<-[:HAS]-(p)-[:HAS]->(h:color)-[:IS_A]->(ph)
WHERE c <> oc AND oc.age > (c.age-10) AND oc.age < (c.age+10)
MATCH (oc)-[:PURCHASE]->(np)-[:HAS]->(u)
WITH p, np, ph, u, COLLECT(DISTINCT p.gra_id) as styles
WHERE p.product_code <> np.product_code AND np.gra_id in styles AND (np)-[:HAS]->(:color)-[:IS_A]->(ph)
WITH u.name as use, np.article_id as product, count(*) as score
ORDER BY score DESC
RETURN use, collect(product)[0..6] as products
ORDER BY use
我有一个大型数据库 >100 万客户,>100k 产品
我正在尝试根据实时数据构建产品推荐。但是,我构建的第一个查询从未解决。 (或者至少我在 30 分钟后停止)
我想输入一个客户并获取他们购买的产品的所有使用情况。然后我想获得所有具有相同用途和更多用途的客户。 (我本来打算做之后的事情,但无法通过这部分)
所有节点都按唯一 ID 编入索引。
MATCH (c:customer {customer_id:'0c4c518e5d1eaf3fc39f93463c2406ad8b659d6c22c9107179e3992f647b12aa'})-[:PURCHASE]->(p:product)-[:HAS]->(u:use)
WITH DISTINCT(u.section_id) as uses
MATCH (ac:customer)-[:PURCHASE]->(ap:product)-[:HAS]->(au:use)
WHERE au.section_id in uses
RETURN ac
我构建了一个执行完整推荐的新查询。但仍然需要1分钟...... 我认为问题是我正在匹配 :use 然后返回,这一定是有太多节点需要排序。
MATCH (c:customer {customer_id:'0c4c518e5d1eaf3fc39f93463c2406ad8b659d6c22c9107179e3992f647b12aa'})-[:PURCHASE]->(p)<-[:PURCHASE]-(oc)
MATCH (u:use)<-[:HAS]-(p)-[:HAS]->(h:color)-[:IS_A]->(ph)
WHERE c <> oc AND oc.age > (c.age-10) AND oc.age < (c.age+10)
MATCH (oc)-[:PURCHASE]->(np)-[:HAS]->(u)
WITH p, np, ph, u, COLLECT(DISTINCT p.gra_id) as styles
WHERE p.product_code <> np.product_code AND np.gra_id in styles AND (np)-[:HAS]->(:color)-[:IS_A]->(ph)
WITH u.name as use, np.article_id as product, count(*) as score
ORDER BY score DESC
RETURN use, collect(product)[0..6] as products
ORDER BY use