Neo4j Cypher:分组/关系

Neo4j Cypher:分组/关系,neo4j,cypher,Neo4j,Cypher,我是Cypher/graph DBs的新手。我创建了一个示例来理解遍历,但并不完全理解它 //Cypher below to create nodes. (`0` :Person {id:'74474',Name:"Mr. Dan"}) , (`1` :Company {id:'1234',Name:"Company A"}) , (`2` :Company {id:'1111',Name:"Company B"}) , (`3` :Person {id:'0844',Name:"M

我是Cypher/graph DBs的新手。我创建了一个示例来理解遍历,但并不完全理解它

//Cypher below to create nodes.
(`0` :Person {id:'74474',Name:"Mr. Dan"}) ,
  (`1` :Company {id:'1234',Name:"Company A"}) ,
  (`2` :Company {id:'1111',Name:"Company B"}) ,
  (`3` :Person {id:'0844',Name:"Mr.X"}) ,
  (`4` :Person {id:'3455',Name:"Mr. Jack"}) ,
  (`5` :Person {id:'748222',Name:"Mr.Y"}) ,
  (`0`)-[:`owns` {amt:'50%'}]->(`1`),
  (`4`)-[:`owns` {amt:'30%'}]->(`1`),
  (`2`)-[:`owns` {amt:'20%'}]->(`1`),
  (`3`)-[:`owns` {amt:'30%'}]->(`2`),
  (`5`)-[:`owns` {amt:'70%'}]->(`2`)
// end
查询: 匹配(p:个人)-(o:拥有*)->(c:公司) 其中c.Name=“A公司” 返回p,o //

这给了我所有拥有“A公司”的“人”,但我想获得每个人的“%所有权”

我似乎无法提取或聚合关系“o”中的值。看起来很容易,但我似乎很有挑战性


有什么建议吗?

首先,如果使用数字值而不是字符串值,那么将所有权金额相乘会更容易。它们需要是十进制格式,
.5
而不是
'50%

可以尝试类似的方法(将金额值更改为浮动后),使用REDUCE()将路径中关系中的所有金额相乘:

MATCH (p:Person)-[owns:owns*]->(c:Company) 
WHERE c.Name="Company A"
RETURN p, reduce(amt = 1, o in owns | amt * o.amt) as percentOwned

需要记住的一点是,可变长度关系(我们使用*)上的变量将引用一组关系,而不是单个关系。

请格式化您的代码,使其可读!匹配(p:Person)-[o:owns*]->(c:Company),其中c.Name=“Company A”返回p,o.amt,c@logisima-不工作,不确定添加c的意图。我试图为每个人汇总“AMT”。所以对于Person,如果关系路径中有两个“amt”,那么它应该聚合(在本例中是相乘)。但即使我能把它们汇总起来,这也是一个开始。谢谢@InverseFalson,说来奇怪。我通过反复试验得出了同样的解决方案。意识到%没有得到很好的处理,并且reduce是唯一有效的功能。