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

时间:2015-01-27 00:42:06

标签: java neo4j cypher

我正在尝试编写一个包含过滤器的查询,该过滤器包含一些值大于0的属性,并且包含两个属性之间的差异大于0的某些节点。但是,使用Neo4j v 2.1.6。< / p>

这是通过嵌入式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`

有关导致此问题的任何想法?或者如何解决它?

1 个答案:

答案 0 :(得分:3)

AS @DaveBennet建议,您可能正在将volumecontent属性设置为字符串值。如果你是,那么这应该“修复”你的问题(同时,请注意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