不知道如何减去也不知道如何比较 Java 中的错误 Cypher 查询

Don't know how to subtract and Don't know how to compare error Cypher query in Java

我正在尝试编写一个具有过滤器的查询,其中包括一些值大于 0 的属性,并包括两个属性之间的差异大于 0 的某些节点。但是,使用 Neo4j v 2.1.6 .

这是通过嵌入式 Neo4j 引擎在 java 程序中 运行 查询。

我的查询看起来像这样:

MATCH (fromJar)-[:IN]->(c)<-[:IN]-(toJar) WHERE c.status='ToDo' AND fromJar.content > 0 AND (toJar.volume - toJar.content) >0 RETURN ID(c) AS contextID, c.step, fromJar.name, fromJar.volume, fromJar.content, toJar.name, toJar.volume, toJar.content

但是,我收到以下错误:

Exception in thread "main" org.neo4j.cypher.CypherTypeException: Don't know how to Subtract(Property(NodeIdentifier(),volume(8),Property(NodeIdentifier(),content(9))) `0` with `5`

关于造成这种情况的原因有什么想法吗?或者如何解决它?

AS @DaveBennet 建议,您可能将 volumecontent 属性设置为字符串值。如果你是,那么这应该 "fix" 你的问题(另外,请注意 WHERE 子句中的最后一项已简化):

MATCH (fromJar)-[:IN]->(c)<-[:IN]-(toJar)
WHERE c.status='ToDo' AND TOINT(fromJar.content) > 0 AND
  (TOINT(toJar.volume) > TOINT(toJar.content))
RETURN ID(c) AS contextID, c.step, fromJar.name, fromJar.volume,
  fromJar.content, toJar.name, toJar.volume, toJar.content;

但是,上面的修复不是很有效,因为它不断地执行(实际上应该是不必要的)类型转换。如果您更改这些属性以便它们具有数值会更好。如果这样做,那么查询将如下所示:

MATCH (fromJar)-[:IN]->(c)<-[:IN]-(toJar)
WHERE c.status='ToDo' AND fromJar.content > 0 AND (toJar.volume > toJar.content)
RETURN ID(c) AS contextID, c.step, fromJar.name, fromJar.volume,
  fromJar.content, toJar.name, toJar.volume, toJar.content;

而且,为了进一步提高性能,查询中的 c 节点应该被标记,并且应该有一个 index for that label and the status property.