Neo4j-返回最大值的节点

Dee*_*dar 2 neo4j cypher

我正在使用以下命令通过csv将数据加载到neo4j

load csv with headers from "file:///path_to.csv" as file
merge (d:DIAGNOSIS {name:file.DIAGNOSIS_SYNONYM})
merge (dn:DRUG_NAME {name:file.DRUG_NAME})
merge (tc:TOTAL_COST {name:toFloat(file.TOTAL_COST)})
merge (cnt:COUNT {name:toInt(file.COUNT)})
merge (ac:AVERAGE_COST {name:toFloat(file.AVERAGE_COST)})
create (dn)-[:for]->(d)
create (d)-[:costs]->(tc)
create (tc)-[:count]->(cnt)
create (cnt)-[:avg_costs]->(ac)
Run Code Online (Sandbox Code Playgroud)

现在,我想找到最高/最低total_cost的诊断。

我试过了

MATCH ((dn)-[:for]-(d)-[:costs]-(tc)-[:count]-(cnt)-[:avg_costs]->(ac))
WITH d,tc, max(tc.name) as maximum
where tc.name= maximum
return d
Run Code Online (Sandbox Code Playgroud)

但是,这将返回所有诊断节点。有人可以建议我我在做什么错。

Bru*_*res 5

既然您只在使用d::DIAGNOSIStc:TOTAL_COST为什么要MATCH遍及整个路径?我相信您MATCH只能(d:DIAGNOSIS)-[:costs]-(tc:TOTAL_COST)忽略其余部分。

另外,请记住尽可能使用标签。标签将提高查询的性能。

我相信使用ORDER BYLIMIT应该可以。尝试:

MATCH ((d:DIAGNOSIS)-[:costs]-(tc:TOTAL_COST))
RETURN d
ORDER BY tc.name DESC
LIMIT 1
Run Code Online (Sandbox Code Playgroud)

或者,您可以首先匹配最大值tc.name,然后在WHERE第二个MATCH中使用它。

MATCH (tc:TOTAL_COST)
WITH  max(tc.name) AS maximum
MATCH ((d:DIAGNOSIS)-[:costs]-(tc:TOTAL_COST))
WHERE tc.name = maximum
RETURN d
Run Code Online (Sandbox Code Playgroud)