Cypher -Tally报告源自父节点的每种关系类型的深度

时间:2015-11-10 16:50:11

标签: neo4j cypher

我正在尝试创建关于源自父节点的每种关系类型的深度的计数报告,但我遇到了以下错误的问题:

"Type mismatch: r already defined with conflicting type Relationship (expected Collection<Relationship>)

以下是我试图实现的输出:

[
   {
      reltype    : "123A_RelationshipTitleOne",
      depthcount : 5
   }, {
      reltype    : "123A_RelationshipTitleTwo",
      depthcount : 9
   }, {
      reltype    : "123A_RelationshipTitleThree",
      depthcount : 42
   }
]

这是我的密码查询尝试,它会生成上面提到的错误。取代&#123; 123A&#39;我使用了一个变量,但我使用了&#123; 123A&#39;作为一个清晰的工作示例:

MATCH (n {id: '123A'})
OPTIONAL MATCH (n)-[r]-()
WHERE left( type(r), LENGTH( '123A' )) = '123A'
OPTIONAL MATCH p=(n)-[r*]->(c)
WITH n, COLLECT({
    id    : type(r),
    count : MAX(length(p))
}) AS leafreport
RETURN n, leafreport

我非常感谢您提供的帮助。

1 个答案:

答案 0 :(得分:0)

使用绑定变量type mismatch首先表示关系,然后(在第二个r中)表示关系集合,导致OPTIONAL MATCH错误。

在模式(n)-[r*]->(c)中,r*表示可变长度路径,因此r绑定到与可变长度模式匹配的关系集合。但是r以前绑定到OPTIONAL MATCH (n)-[r]-()中的关系,因此错误。如果要检查r是否在p路径中,请使用WHERE子句。像这样:

MATCH (n {id: '123A'})
MATCH (n)-[r]-()
WHERE left( type(r), LENGTH( '123A' )) = '123A'
MATCH p=(n)-[rs*]->(c) WHERE r IN rs
WITH n, {
    id    : type(r),
    count : MAX(length(p))
} AS leafreport
RETURN n, leafreport

我认为您不希望第二个OPTIONAL MATCH是可选的,因此我将其更改为MATCH子句