Cypher中如何筛选与apoc返回的rel关联的childD节点?
解决Cypher中关联APOC返回关系的节点筛选问题
嘿,我明白你遇到的问题了——你用apoc.index.between拿到了符合条件的关系rel,但不知道怎么正确关联对应的childD节点,之前的写法报错是因为不符合Cypher的语法规则。
先帮你理清逻辑:apoc.index.between的调用参数是childD(起始节点)、'HAS_VALUE_ON'(关系类型)、filterCharacteristic1(目标节点),再加上查询条件(value:(10)),所以返回的rel本身就是连接childD和filterCharacteristic1的符合条件的关系。这意味着你不需要再额外执行MATCH来关联它们,因为childD和rel已经在APOC调用的上下文中绑定了。
修正后的查询
直接去掉多余的MATCH步骤,简化后的查询如下:
MATCH (dg:DecisionGroup)-[:CONTAINS]->(childD:Decision) WHERE dg.id = {decisionGroupId} MATCH (filterCharacteristic1:Characteristic) WHERE filterCharacteristic1.id = 1 WITH dg, childD, filterCharacteristic1 CALL apoc.index.between(childD, 'HAS_VALUE_ON', filterCharacteristic1, '(value:(10))') YIELD rel WITH DISTINCT dg, childD, rel -- 这里可以直接使用childD,它就是和rel关联的符合条件的节点 RETURN dg, childD, rel
为什么原来的写法报错?
Cypher的语法要求关系必须用方括号[]包裹,并且要明确节点与关系的连接方向(或无方向),比如(a)-[r]->(b)或(a)-[r]-(b)。你之前写的(childD)-(rel)或(childD)-[rel]都不符合规范:
(childD)-(rel)把关系rel当成了节点,语法错误;(childD)-[rel]缺少了另一端的节点,Cypher无法识别完整的模式。
如果一定要显式写出关联模式(虽然这里冗余),可以写成:
-- 在WITH DISTINCT之后添加 MATCH (childD)-[rel:HAS_VALUE_ON]->(filterCharacteristic1)
但实际上完全不需要这一步,因为APOC已经帮你筛选出了对应的关系和节点。
内容的提问来源于stack exchange,提问作者alexanoid
相关产品推荐
相关产品推荐

