使用cypher的特定查询

时间:2013-11-27 11:18:13

标签: neo4j cypher

我需要特定查询的帮助。我正在使用neo4j。我的数据库由公司(节点)和它们之间的交易(关系)组成。每个关系(PAID)都有属性: 金额 - 交易金额 交易年份 月 - 交易月

我需要的是从节点A开始查找图表中的所有周期。事务也必须一个接一个地发生。

如此有效的例子是3月的A PIAD B,4月的B PAID C,6月的C PAID A.

那么有没有办法从节点A获取所有周期,以便事务按连续顺序发生?

1 个答案:

答案 0 :(得分:0)

您可能希望在Neo4j console设置示例图表,以便分享或至少告诉您正在使用的Neo4j的版本,但是如果您使用的是2.0以及是否存储年份和月份如长或整数,那么也许你可以尝试像

这样的东西
MATCH a-[ab:PAID]->b-[bc:PAID]->c-[ca:PAID]->a 
WHERE (ab.year + ab.month) > (bc.year + bc.month) > (ca.year + ca.month)
RETURN a,b,c

修改 实际上那很仓促,当然这些增加不会起作用,但结构应该没问题。也许

WHERE ((ab.year > bc.year) or (ab.year = bc.year AND ab.month > bc.month))
    AND ((bc.year > ca.year) OR (bc.year = ca.year AND bc.month > ca.month))

WHERE (ab.year * 12 + ab.month) > (bc.year * 12 + bc.month) > (ca.year * 12 + ca.month)

如果您只使用日期进行此类比较,请考虑将它们存储为一个属性,也许是以毫秒为单位,因为' epoch'格林威治标准时间1/1 -70。这使得比较非常容易。但是如果你需要经常返回并显示日期,那么将它们分开可能是有意义的。

<强> EDIT2:
我无法想出一种方法来建立你的条件&#34; r1.date&lt; r2.date&#34;进入模式,这意味着匹配所有可变深度循环,然后丢弃其中的一些(大多数)。这在大型图表中不会变得昂贵,而且您可能最好建立一个遍历或服务器插件,这可以在遍历期间做出复杂的迭代决策。在2.0中,感谢Wes&#39;优雅的集合切片,你可以试试这样的东西

MATCH path=a-[ab:PAID*..10]->a 
WHERE ALL (ix IN range(0,length(ab)-2) 
    WHERE ((ab[ix]).year * 12 +(ab[ix]).month)<((ab[ix+1]).year * 12 +(ab[ix+1]).month)) 
RETURN path

使用HEAD()TAIL()可能会在1.9中实现相同的目标。再次,在控制台中共享样本数据,也许其他人可以投入。