【问题标题】:Including vars in Neo4j WITH statement changes query output在 Neo4j WITH 语句中包含 var 会更改查询输出
【发布时间】:2026-01-28 23:20:02
【问题描述】:

我试图在我的数据库中查找连接到多个其他类型节点的特定类型节点的数量。就我而言,它是连接到多个名称节点的地方节点。我有一个有效的查询:

MATCH rels=(p:Place)-[c:Called]->(n:Name) 
WITH p,count(n) as counts 
WHERE counts > 1 
RETURN p;`

但是,这只返回位置节点,理想情况下我希望它返回所有涉及的节点和边。我找到了a question on returning variables from before the WITH,但是如果我包含了我定义的任何其他变量,则查询不会返回任何响应,即此查询不会返回任何内容:

MATCH rels=(p:Place)-[c:Called]->(n:Name) 
WITH p, count(n) as counts, rels
WHERE counts > 1 
RETURN p;

我不知道如何在不更改查询结果的情况下返回我想要的信息。任何帮助将不胜感激

【问题讨论】:

    标签: neo4j cypher


    【解决方案1】:

    第二个查询不返回任何内容的原因是因为它的WITH 子句将aggregation 指定为prels 的“分组键”。由于每个rels 路径只有一个n 值,因此counts 将始终为1。

    这样的事情可能对你有用:

    MATCH path=(p:Place)-[:Called]->(:Name) 
    WITH p, COLLECT(path) as paths 
    WHERE SIZE(paths) > 1 
    RETURN p, paths;
    

    这将返回每个匹配的 Place 节点及其所有路径。

    【讨论】:

    • 感谢您链接到聚合说明,它绝对可以帮助我了解在这种情况下发生了什么,并在我的数据库中启动了一个很好的优雅查询。​​
    【解决方案2】:

    试试这个:

    MATCH (p:Place)-[c:Called]->(n:Name)
    WHERE size((p)-[:Called]->(:Name)) > 1
    WITH p,count(n) as counts, collect(n) AS names, collect(c) AS calls
    RETURN p, names, calls, counts ORDER BY counts DESC;
    

    此查询利用 Cypher 的 collect() 函数为每个与 Name 节点有多个 Called 关系的地方创建名称列表和被调用关系。

    【讨论】:

    • 感谢您,您的查询确实适用于我的数据库,它有助于更​​好地理解收集。要是我有不止一张验收单就好了!