基于特征增量的Neo4j Cypher查询查找节点

基于特征增量的Neo4j Cypher查询查找节点,neo4j,cypher,Neo4j,Cypher,在我的Neo4j/Spring数据Neo4j 4项目中,我有一个实体:Product 每个产品都有一个整数属性-价格 例如,我有以下产品的价格: Product1.price = 100 Product2.price = 305 Product3.price = 10000 Product4.price = 1000 Product5.price = 220 产品之间没有相互连接的关系 我需要根据初始价格值(Cypher查询参数)找到一组(路径)产品,这些产品通过最大价格增量(Cypher查询

在我的Neo4j/Spring数据Neo4j 4项目中,我有一个实体:
Product

每个
产品
都有一个
整数
属性-
价格

例如,我有以下产品的价格:

Product1.price = 100
Product2.price = 305
Product3.price = 10000
Product4.price = 1000
Product5.price = 220
产品之间没有相互连接的关系

我需要根据初始价格值(Cypher查询参数)找到一组(路径)产品,这些产品通过最大价格增量(Cypher查询参数)相互区分

例如,我需要在Neo4j数据库中查找从price=50和price delta=150开始的所有产品。作为输出,我希望获得以下产品:

Product1.price = 100
Product5.price = 220
Product2.price = 305
计算结果如下所示:

起始点价格=50,因此第一个产品的价格应不低于50且不超过200(50+150)。基于此,我们从目录中找到了一种价格为100的产品。第二种产品的价格应不低于100且不超过250(100+150)。。这是一种价格为220英镑的产品。。第三种价格不低于220美元,不高于370美元。这是一款价格为305英镑的产品


您能否显示一个可以查找此类产品的密码查询。

这在密码中执行相当复杂。我想到的唯一方法是使用REDUCE()函数和CASE语句,如果产品在列表中最后一个产品的价格增量范围内,则有条件地将其添加到列表的末尾

请记住,使用这种方法无法缩短产品的加工过程。如果总共有100万个产品,并且我们在订购的产品列表中发现只有前两个产品在该增量模式中,则此查询将继续检查这100万个产品中的每一个剩余产品,尽管它们都不会添加到我们的列表中

这个查询应该适合您

WITH {startPrice:50, delta:150} as params
MATCH (p:Product)
WHERE p.price >= params.startPrice
WITH params, p
ORDER BY p.price asc
WITH params, COLLECT(p) as products
WITH params, TAIL(products) as products, HEAD(products) as first
WHERE first.price <= params.startPrice + params.delta
WITH REDUCE(prods = [first], prod in products | 
  CASE WHEN prod.price <= LAST(prods).price + params.delta 
       THEN prods + prod 
       ELSE prods END) as products
RETURN products
以{startPrice:50,delta:150}作为参数
匹配(p:产品)
其中p.price>=params.startPrice
用params,p
按p.price asc订购
使用params,将(p)收集为产品
以参数、尾部(产品)为产品、头部(产品)为第一

其中first.price解决方案需要在迭代过程中传递中间结果。一个有趣的问题,因为今天cypher没有直接提供这种可能性。作为练习(草图),使用-library中的
apoc.periodic.commit
过程:

调用apoc.create.uuid()产生uuid
调用apoc.periodic.commit(“
合并(H:tmpVars{id:{tmpId}})
在创建集合H时,价格=[],
H.lastPrice={lastPrice},
H.delta={delta}
与H
匹配(P:Product),其中P.price>H.lastPrice和
P.price
作为一种替代解决方案,查询速度应该更快,但需要更多的维护和保养才能保持正常工作(特别是在产品价格数据快速变化的情况下),您可以按升序在产品节点之间创建关系,并将增量保留为关系属性

以下是您如何使用APOC程序创建此文件:

MATCH (p:Product)
WITH p 
ORDER BY p.price ASC
WITH apoc.coll.pairsMin(COLLECT(p)) as products
UNWIND products as prodPairs
WITH prodPairs[0] as prod1, prodPairs[1] as prod2
CREATE (prod1)-[r:NextProd]->(prod2)
SET r.delta = prod2.price - prod1.price
这是设置好后您可以查询的方式

WITH {startPrice:50, delta:150} as params
WITH params, params.startPrice + params.delta as ceiling
MATCH (start:Product)
WHERE params.startPrice <= start.price <= ceiling
WITH start, params
ORDER BY start.price ASC
LIMIT 1
MATCH (start)-[r:NextProd*0..]->(product:Product)
WHERE ALL(rel in r WHERE rel.delta <= params.delta)
RETURN DISTINCT product
以{startPrice:50,delta:150}作为参数
使用params,params.startPrice+params.delta作为天花板
匹配(开始:产品)

在哪里params.startPrice您可以澄清价格和价格增量是如何影响计算的?我的假设是你想从价格开始,三角洲会给你一个价格的下限和上限-/+三角洲,但这意味着上限是200(50+150)。你们产出的价格超过了这个数字,所以我的假设是错误的,但我不知道你们想用什么计算方法,像这样吗?50作为初始价格,150作为增量,当(初始价格增量)>0时,则(初始价格增量)否则0作为下限,(初始价格+增量)作为上限匹配(n:Product),其中下限WITH {startPrice:50, delta:150} as params WITH params, params.startPrice + params.delta as ceiling MATCH (start:Product) WHERE params.startPrice <= start.price <= ceiling WITH start, params ORDER BY start.price ASC LIMIT 1 MATCH (start)-[r:NextProd*0..]->(product:Product) WHERE ALL(rel in r WHERE rel.delta <= params.delta) RETURN DISTINCT product