我正在尝试编写一个包含过滤器的查询,该过滤器包含一些值大于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`
有关导致此问题的任何想法?或者如何解决它?
答案 0 :(得分:3)
AS @DaveBennet建议,您可能正在将volume
和content
属性设置为字符串值。如果你是,那么这应该“修复”你的问题(同时,请注意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。