基于模式理解的Neo4j密码节点过滤

基于模式理解的Neo4j密码节点过滤,neo4j,cypher,Neo4j,Cypher,我拥有以下SDN 4实体: 决定、特征和价值: 我已经创建了3个DecisionDecision1、Decision2、Decision3节点和1个CharacteristicCharacteristic1。 对于Decision1、Decision2和Characteristic1,我创建了一个双值,例如: Decision1 + Characteristic1 = Value(500d) Decision2 + Characteristic1 = Value(1000d) Decicion3

我拥有以下SDN 4实体:

决定、特征和价值:

我已经创建了3个DecisionDecision1、Decision2、Decision3节点和1个CharacteristicCharacteristic1。 对于Decision1、Decision2和Characteristic1,我创建了一个双值,例如:

Decision1 + Characteristic1 = Value(500d)
Decision2 + Characteristic1 = Value(1000d)
Decicion3 doesn't have any Value on Characteristic1
ALL(key IN keys({equalFilters}) WHERE id(filterCharacteristic) = toInt(key) AND filterValue.value = ({equalFilters}[key]))  

我需要创建一个查询,该查询将返回所有值在定义范围内的决策,例如100基于示例数据,您只需要正确链接所有检查。这个例子中没有关于家长的内容,但我认为这只是把你搞砸了的关键部分

WITH {c1:[100,50000]} AS rangeFilters
MATCH (childD:Decision)<--(fv:FilterValue)-->(c:FilterCharacteristic) 
WHERE ALL(key IN keys(rangeFilters) 
    WHERE c.id=key AND rangeFilters[key][0] < fv.value < rangeFilters[key][1]) 
RETURN childD
尽管也可以将FilterValue设置为关系,因为关系也可以具有属性

更新:

至于你的问题,所有人都平等。。。还有阿林努山脉。。。;读取所有相等过滤器均为真且所有范围过滤器均为真的位置。所以我猜你真的希望他们中的任何一个都是真的,那就是任何一个相等的。。。或任何可用的In_范围,因为filter.value不可能同时等于7和9


另外,作为补充说明,不要在查询中使用id,因为Neo4j保留更改这些内容的权利。设置您自己的id字段,并改用UUID。如果您需要合并数据集,UUID也更可靠。

谢谢您的回答,但我问题中提供的示例只是全局的一部分。所以我对我的问题中描述的方法感兴趣。@alexanoid固定使用范围键部分。谢谢。我试图应用你的解决方案,但部分成功。我已经更新了我的问题的细节。一般来说,查询只能在单个筛选条件下工作,如果存在多个筛选条件,则无法工作。@alexanoid我更新了答案以解决您的新问题。谢谢,但这不是我所期望的。我已经应用了2个过滤器,其条件是针对不同的特性使用不同的值。因此,我正在尝试查找所有节点决策,这些节点决策的Characteristic1.value在某个范围内,Characteristic2.value等于某个值。您能否为新查询更新一个新的最小可验证示例?这可能真的应该是一个新问题。。。
MATCH (parentD)-[:CONTAINS]->(childD:Decision)-[ru:CREATED_BY]->(u:User) 
WHERE id(parentD) = {decisionId} 
MATCH (childD)<-[:SET_FOR]-(filterValue)-[:SET_ON]->(filterCharacteristic) 

WHERE  

ALL(key IN keys({equalFilters}) WHERE id(filterCharacteristic) = toInt(key) AND filterValue.value = ({equalFilters}[key]))  

AND  

ALL(key IN keys({rangeFilters}) WHERE id(filterCharacteristic) = toInt(key) AND ({rangeFilters}[key])[0] <= filterValue.value <= ({rangeFilters}[key])[1])  

RETURN ru, u, childD AS decision SKIP 0 LIMIT 100
ALL(key IN keys({equalFilters}) WHERE id(filterCharacteristic) = toInt(key) AND filterValue.value = ({equalFilters}[key]))  
ALL(key IN keys({rangeFilters}) WHERE id(filterCharacteristic) = toInt(key) AND ({rangeFilters}[key])[0] <= filterValue.value <= ({rangeFilters}[key])[1]) 
WITH {c1:[100,50000]} AS rangeFilters
MATCH (childD:Decision)<--(fv:FilterValue)-->(c:FilterCharacteristic) 
WHERE ALL(key IN keys(rangeFilters) 
    WHERE c.id=key AND rangeFilters[key][0] < fv.value < rangeFilters[key][1]) 
RETURN childD