Neo4j 如何匹配所有匹配连接上的节点?

Neo4j 如何匹配所有匹配连接上的节点?,neo4j,cypher,Neo4j,Cypher,我想返回所有与p1:遭遇具有相同ICD9DX代码的遭遇(p2)。因此,如果p1有3个ICD9DX代码,我想找到具有相同3个代码的p2节点。最后,我想知道如何编写查询,以便它只返回只有才有这三个代码的p2节点,以及如何编写查询,以便它将返回至少有这三个代码的节点。我试着从已经回答过的其他问题中找出答案,但到目前为止都没有成功。下面是我的最新迭代 MATCH path=((p1:Encounter {PatientAccount: '1003149560'})-[:HasICD9Dx]-(i:ICD

我想返回所有与p1:遭遇具有相同ICD9DX代码的遭遇(p2)。因此,如果p1有3个ICD9DX代码,我想找到具有相同3个代码的p2节点。最后,我想知道如何编写查询,以便它只返回只有才有这三个代码的p2节点,以及如何编写查询,以便它将返回至少有这三个代码的节点。我试着从已经回答过的其他问题中找出答案,但到目前为止都没有成功。下面是我的最新迭代

MATCH path=((p1:Encounter {PatientAccount: '1003149560'})-[:HasICD9Dx]-(i:ICD9DX)-[:HasICD9Dx]-(p2:Encounter))
WHERE ALL(p1 in tail(nodes(path)) WHERE ()-[:HasICD9Dx]->p1) 
RETURN p2
我是Neo4j的新手,所以对逻辑的任何评论都会有所帮助。我见过其他文章使用WITH来处理类似的主题,但我很难理解WITH子句。也许我只需要深入阅读手册。

我终于明白了(似乎)。要返回至少与p1相关代码匹配的遭遇,请执行以下操作:

MATCH (p1:Encounter {PatientAccount: '1002844934'})-[:HasICD9Dx]-(i:ICD9DX)
WITH COUNT(i) AS codes, p1
MATCH (p2:Encounter)-[:HasICD9Dx]-(i:ICD9DX)-[:HasICD9Dx]-(p1)
WITH count(i) as foundCodes, codes, p2
WHERE foundCodes = codes
MATCH (p2)-[:HasICD9Dx]-(i:ICD9DX)
WITH count(i) as totalCodes, codes, p2
RETURN p2.PatientAccount, totalCodes
要返回与p1代码完全相同的遭遇,请执行以下操作:

MATCH (p1:Encounter {PatientAccount: '1002844934'})-[:HasICD9Dx]-(i:ICD9DX)
WITH COUNT(i) AS codes, p1
MATCH (p2:Encounter)-[:HasICD9Dx]-(i:ICD9DX)-[:HasICD9Dx]-(p1)
WITH count(i) as foundCodes, codes, p2
WHERE foundCodes = codes
MATCH (p2)-[:HasICD9Dx]-(i:ICD9DX)
WITH count(i) as totalCodes, codes, p2
WHERE totalCodes = codes
RETURN p2.PatientAccount

具体来说,3个代码有什么重要的地方吗?或者你是说任意数量的代码吗?我可以从两个方面看到这个问题:(1)哪些遭遇有完全相同的代码,而没有更多的代码;(2)哪些遭遇至少有这些代码。不过我想我已经明白了。我将提供我得到的答案。WITH子句:类似于RETURN,但您可以将数据从一个查询部分传输到另一个查询部分,只有您传输的数据是可见的,并且您可以像RETURN一样进行任何投影、聚合、筛选和排序。