关系列表上的Neo4J | Cypher聚合

关系列表上的Neo4J | Cypher聚合,neo4j,cypher,Neo4j,Cypher,Neo4J/Cypher的新功能,以下是我的疑问: MATCH (origin:BusStop)-[bus*]->(destination:BusStop) WITH bus WHERE origin.name =~ '(?i).*Origin.*' AND destination.name =~ '(?i).*Destination.*' AND all(rel in bus where rel.day in ['Sat']) RETURN bus 我正设法在出发地和目的地之间安排

Neo4J/Cypher的新功能,以下是我的疑问:

MATCH (origin:BusStop)-[bus*]->(destination:BusStop)
WITH bus
WHERE origin.name =~ '(?i).*Origin.*' 
AND destination.name =~ '(?i).*Destination.*' 
AND all(rel in bus where rel.day in ['Sat'])
RETURN bus
我正设法在出发地和目的地之间安排所有可能的公共汽车。在上面的查询中,我还需要总票价(作为求和函数)

注意:该关系有一个名为fare SUM(bus.fare))的属性。

使用,您可以对集合的元素求和,但需要从bus集合中的每个关系中提取票价值:

RETURN bus, apoc.coll.sum([rel in bus | rel.fare]) as totalFare
如果没有APOC过程,则需要使用REDUCE():


这里有一种不用APOC的方法:

测试数据:

CREATE (o:BusStop {id: 1})
CREATE (i1:BusStop {id: 2})
CREATE (d:BusStop {id: 3})
CREATE (i2:BusStop {id: 4})
MERGE (o)-[:Bus {day: "Sat", fare: 10}]->(i1)-[:Bus {day: "Sat", fare: 15}]->(d)
MERGE (o)-[:Bus {day: "Sun", fare: 5}]->(i1)-[:Bus {day: "Sun", fare: 15}]->(d)
MERGE (o)-[:Bus {day: "Mon", fare: 20}]->(i1)
MERGE (i1)-[:Bus {day: "Sat", fare: 5}]->(i2)-[:Bus {day: "Sat", fare: 9}]->(d);
查询:

MATCH p=(o:BusStop)-[*]->(d:BusStop)
WHERE o.id = 1
  AND d.id = 3
  AND ALL (rs in relationships(p) 
  WHERE rs.day in ['Sat'])
WITH p, relationships(p) AS rels
UNWIND rels AS rel
RETURN DISTINCT p, sum(rel.fare) AS price;
希望这有帮助

问候,,
汤姆

谢谢你的回复。这就是那条路线上所有公共汽车的总票价。我需要每辆车的总票价。每辆车的总票价。。。但这正是rel.fare属性包含的内容,不是吗?那么为什么你需要一个总数呢(正如你所说的)?如果有某种方法来区分路线给定路段上的公交车,你需要指定数据来进行区分。
MATCH p=(o:BusStop)-[*]->(d:BusStop)
WHERE o.id = 1
  AND d.id = 3
  AND ALL (rs in relationships(p) 
  WHERE rs.day in ['Sat'])
WITH p, relationships(p) AS rels
UNWIND rels AS rel
RETURN DISTINCT p, sum(rel.fare) AS price;