Neo4J找到了独特的结果

时间:2014-01-05 22:03:46

标签: java neo4j cypher

我有一个图表显示公司之间的财务关系 - 欠款关系,公司欠公司的钱。我寻求一种独特的关系 - 圈子,后者是封闭的。所以,如果我欠你的钱,我们发现你欠我的钱,我关闭债务。这些公司按税号确定。为此,我使用此Cypher查询:

start n=node(*) 
match p=n-[r:OWES*1..200]->n 
where HAS(n.taxnumber) 
return  extract(s in relationships(p) : s.amount), 
        extract(t in nodes(p) : ID(t)), 
        length(p) ;

但我也得到像

这样的结果
Company1-Company2-company1-Company-3

我在java应用程序中显示了这个结果。在我用java代码解析它们之后,我是否应该隐藏这个结果 - 一个公司被显示两次的结果。 这在逻辑方面很好,但我需要一个公司只展示一次的结果,我不想要多次获得同一公司的结果。如何修改我的Cypher查询?我想要的是结果中的公司只能在结果的开头和结尾处,而不是在中间盘旋。

1 个答案:

答案 0 :(得分:2)

您可以尝试检查路径节点不包含起始节点。

start n=node(*) 
match p=n-[:OWES*1..200]->(m), (m)-[r:OWES]->n 
where HAS(n.taxnumber) 

AND NOT(n IN tail(nodes(p)))

return  extract(s in relationships(p) : s.amount) + r.amount, 
        extract(t in nodes(p) : ID(t)) + ID(n), 
        length(p) + 1;

不幸的是1.8.2中没有下标,只有tail(coll)没有简单的方法可以从检查中排除最后一个元素。这就是为什么我必须分解p并在最后修复你的聚合。