AGE查询中!=运算符无法阻止节点自关联且关联错误节点,如何解决?
正确实现节点关联的查询方案
你的问题核心是两个:一是无法正确排除节点自连,二是错误关联了不具备backend title的节点。可以通过以下方式修正查询:
1. 先在MATCH子句中过滤节点属性
把title = 'backend'的条件直接写在节点匹配模式里,这样能提前筛选出符合要求的Person节点,避免后续WHERE条件判断时出现意外(比如节点没有title属性导致的逻辑判断异常):
SELECT * FROM cypher('devbook', $$ MATCH (a: Person {title: 'backend'}), (b: Person {title: 'backend'}) WHERE id(a) <> id(b) CREATE (a)-[e:STACK_MATCH { title: 'backend' }]->(b) RETURN e $$) as (relationship agtype);
2. 确认ID比较的正确性
在AgGraph的Cypher实现中,id()函数返回的是节点内部ID,使用<>或!=都能实现不等判断,但必须确保是在已经过滤出目标节点之后再做ID比较,否则会因为笛卡尔积包含大量无关节点,导致WHERE条件失效。
3. 避免重复创建关系(可选)
如果不想重复创建相同的STACK_MATCH关系,可以把CREATE换成MERGE,这样只会在不存在该关系时创建:
SELECT * FROM cypher('devbook', $$ MATCH (a: Person {title: 'backend'}), (b: Person {title: 'backend'}) WHERE id(a) <> id(b) MERGE (a)-[e:STACK_MATCH { title: 'backend' }]->(b) RETURN e $$) as (relationship agtype);
内容的提问来源于stack exchange,提问作者Marcos Silva
相关产品推荐
相关产品推荐

