You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在AGE的Cypher查询中使用子查询提取节点名称?

问题描述

已通过以下语句在AGE中创建了Route节点及带有time属性的Connects关系:

SELECT *
FROM cypher('Map', $$
    CREATE (a:Route {name: 'A'}), 
        (b:Route {name: 'B'}),
        (c:Route {name: 'C'}),
        (d:Route {name: 'D'}),
        (e:Route {name: 'E'}),
        (f:Route {name: 'F'}),
        (a)-[:Connects {time: 4}]->(b),
        (a)-[:Connects {time: 2}]->(c),
        (b)-[:Connects {time: 6}]->(c),
        (b)-[:Connects {time: 9}]->(d),
        (c)-[:Connects {time: 1}]->(d),
        (c)-[:Connects {time: 8}]->(e),
        (c)-[:Connects {time: 3}]->(f),
        (d)-[:Connects {time: 3}]->(a),
        (e)-[:Connects {time: 10}]->(b),
        (f)-[:Connects {time: 2}]->(e)
$$) AS (x agtype);

随后使用以下语句查询从Route 'A'到Route 'F'的所有路径及总旅行时间:

SELECT * FROM cypher('Map', $$
    MATCH paths = (a:Route {name: 'A'})-[:Connects *]->(b:Route {name: 'F'})
    WITH paths, relationships(paths) AS rels
    UNWIND rels AS rel
    WITH nodes(paths) AS nodes,
        collect(rel.time) AS routes,
        sum(rel.time) AS travelTime
    RETURN nodes, routes, travelTime
$$) AS (nodes agtype, routes agtype, travelTime agtype)
ORDER BY travelTime;

查询结果中nodes列显示完整节点详情,希望将该列改为仅显示节点名称(例如{"A", "C", "F"})。尝试过Neo4j的CALL{}子句,但AGE不支持该语法,询问实现方法。

解决方案

AGE暂不支持CALL{}子句,但可以通过以下两种方式提取节点名称,满足需求:

方案1:使用列表推导式(简洁写法)

直接在RETURN阶段通过列表推导式遍历节点集合,提取每个节点的name属性:

SELECT * FROM cypher('Map', $$
    MATCH paths = (a:Route {name: 'A'})-[:Connects *]->(b:Route {name: 'F'})
    WITH paths, relationships(paths) AS rels
    UNWIND rels AS rel
    WITH nodes(paths) AS nodes,
        collect(rel.time) AS routes,
        sum(rel.time) AS travelTime
    RETURN [node IN nodes | node.name] AS node_names, routes, travelTime
$$) AS (node_names agtype, routes agtype, travelTime agtype)
ORDER BY travelTime;

方案2:UNWIND节点集合后收集名称

如果对列表推导式不熟悉,可先展开节点集合,收集每个节点的name后再聚合:

SELECT * FROM cypher('Map', $$
    MATCH paths = (a:Route {name: 'A'})-[:Connects *]->(b:Route {name: 'F'})
    WITH paths, relationships(paths) AS rels
    UNWIND rels AS rel
    WITH paths, collect(rel.time) AS routes, sum(rel.time) AS travelTime
    UNWIND nodes(paths) AS node
    WITH paths, routes, travelTime, collect(node.name) AS node_names
    RETURN node_names, routes, travelTime
$$) AS (node_names agtype, routes agtype, travelTime agtype)
ORDER BY travelTime;

内容的提问来源于stack exchange,提问作者Ken W.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 12:07:27