Neo4j Cypher-对源自父节点的每个关系类型的深度进行计数报告

Neo4j Cypher-对源自父节点的每个关系类型的深度进行计数报告,neo4j,cypher,Neo4j,Cypher,我正在尝试创建有关源于父节点的每种关系类型的深度的计数报告,但遇到以下错误: "Type mismatch: r already defined with conflicting type Relationship (expected Collection<Relationship>) 下面是我的密码查询尝试,它生成了上面提到的错误。我使用变量“123A”代替“123A”,但我在此处使用“123A”作为清晰的工作示例: MATCH (n {id: '123A'}) OPTIONAL

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

"Type mismatch: r already defined with conflicting type Relationship (expected Collection<Relationship>)
下面是我的密码查询尝试,它生成了上面提到的错误。我使用变量“123A”代替“123A”,但我在此处使用“123A”作为清晰的工作示例:

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

非常感谢您提供的帮助。

使用绑定变量
r
首先表示一个关系,然后(在第二个
可选匹配中)表示一组关系,从而导致
类型不匹配
错误

在模式
(n)-[r*]->(c)
中,
r*
表示可变长度路径,因此
r
绑定到与可变长度模式匹配的关系集合。但是,
r
先前绑定到了
可选匹配(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

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

非常感谢您@William Lyon的帮助,尽管我仍然遇到了问题。第二个可选匹配适用于没有满足where left(type(r),LENGTH('123A'))=“123A”的关系的场景,如果没有第二个可选匹配,我会得到以下错误:“MATCH不能跟在可选匹配之后(可能在它们之间使用WITH子句)对于第二个可选匹配,我得到了这个错误:参数映射不能在匹配模式中使用(使用文字映射,例如\ \“{id:{param}.id}\\”)(第1行第10列(偏移量:9))\\n\\\\“匹配(n{u nodeid}),而不是
匹配(n{u nodeid})
您应该使用
匹配(n{id:{u nodeid})
其中
\u nodeid
{id:'123a'}
。这导致了参数映射错误。那么您是否要使用
可选匹配
?任何在可选匹配中不匹配的模式片段都将为
NULL
,并通过管道传输到查询的其余部分。我不认为这是你想要的。thnx-参数映射错误现已解决-为我的输入错误道歉。我现在明白你关于可选匹配的观点了,因为我现在得到了{“id”:null,“count”:null}对于不支持WHERE left(type(r),LENGTH('123A'))='123A'的情况,但是避免匹配不能跟在可选匹配之后的唯一方法是使可选匹配(n)-[r]()现在不管{“id”:null,“count”:null},查询都在运行问题,但它真的很慢,返回的计数是4,而不是从这个查询匹配中创建的两个(p=(n{id:'123a'})-[r:
123a_RelationshipTitleOne
*]->(c)返回最大值(长度(p))
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