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