如何在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.
相关产品推荐
相关产品推荐

