如何用单条Cypher查询识别源/目标节点不存在的Edge?
Cypher查询筛选节点不存在的边
问题背景
Edge对象结构如下:
class Edge { public long srcNodeId; public long destNodeId; }
给定一个List<Edge>,能否通过单条Cypher查询返回所有源节点、目标节点其中一个或两者都不存在的边?
解答
可以通过单条Cypher查询实现,核心是导入边列表后逐个验证节点存在性,具体写法如下:
UNWIND $edges AS edge OPTIONAL MATCH (src) WHERE id(src) = edge.srcNodeId OPTIONAL MATCH (dest) WHERE id(dest) = edge.destNodeId WITH edge, src, dest WHERE src IS NULL OR dest IS NULL RETURN edge.srcNodeId AS srcNodeId, edge.destNodeId AS destNodeId
逻辑说明
UNWIND $edges AS edge:将传入的边列表参数展开为单条边的集合,方便逐个处理- 两个
OPTIONAL MATCH:分别尝试匹配每条边的源节点和目标节点,若节点不存在,对应的变量会被设为NULL WHERE src IS NULL OR dest IS NULL:筛选出至少一个节点不存在的边- 最后返回这些边的源节点ID和目标节点ID
如果你的节点使用自定义ID属性(而非Neo4j内置ID),只需将查询中的id(src) = edge.srcNodeId替换为src.自定义属性名 = edge.srcNodeId即可,目标节点的匹配逻辑同理。
内容的提问来源于stack exchange,提问作者Arjun
相关产品推荐
相关产品推荐

