Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Neo4j 如何在联合查询后获得交集_Neo4j_Cypher - Fatal编程技术网

Neo4j 如何在联合查询后获得交集

Neo4j 如何在联合查询后获得交集,neo4j,cypher,Neo4j,Cypher,我正在从事一个使用neo4j图形数据库的项目。我正在构建一个用户界面,该界面生成一个cypher查询,以从graph DB检索一些结果。基本上,我有参与手术的患者,这些手术有数字结果。其思想是用户可以选择不同的程序,例如“Pa”、“Pb”和“Pc”,也可以受其结果的限制;例如,“Pa”的结果应介于2和7之间。然后,应提取满足要求的患者 为此,我将为每个过程生成一个通用查询,然后使用“联合”将所有查询放在一起。例如(非常简单,因为我的数据模型更复杂): 匹配(患者:患者) 耐心地 呼叫{ 耐心地

我正在从事一个使用neo4j图形数据库的项目。我正在构建一个用户界面,该界面生成一个cypher查询,以从graph DB检索一些结果。基本上,我有参与手术的患者,这些手术有数字结果。其思想是用户可以选择不同的程序,例如“Pa”、“Pb”和“Pc”,也可以受其结果的限制;例如,“Pa”的结果应介于2和7之间。然后,应提取满足要求的患者

为此,我将为每个过程生成一个通用查询,然后使用“联合”将所有查询放在一起。例如(非常简单,因为我的数据模型更复杂):

匹配(患者:患者)
耐心地
呼叫{
耐心地
匹配(患者)-[:`isParticipantIn`]->(过程:`Pa`)-[:`hasResult`]->(结果:`ResultValue`)
其中(result.hasValue>=2和result.hasValue(过程:`Pb`)-[:`hassresult`]->(结果:`ResultValue`)
将不同的患者作为患者的内部、程序、结果返回
联合
耐心地
匹配(患者)-[:`isParticipantIn`]->(过程:`Pc`)-[:`hasResult`]->(结果:`ResultValue`)
将不同的患者作为患者的内部、程序、结果返回
}
返回不同的patient.label、procedure.label、result.hasValue
此查询可能有以下结果,其中包括参与“Pb”、“Pc”或“Pa”的所有患者,其结果介于2和7之间,因为联合意味着or:

尽管如此,我还是希望允许AND连接,以便检索所有参与“Pb”、“Pc”和“Pa”的患者,结果介于2和7之间

因此,我想删除patient2和patient3,因为它们不符合“和”条件

我发现的第一个问题是,在联合之后,所有内容都被合并了,我不知道哪些行来自哪个查询。我不能使用“过程”列,因为用户可以多次选择同一个过程以包含不同的限制,这些限制在同一过程的多个联合中被转换。我可以通过在每个联合查询中包含一个常量,如下所示:

MATCH (patient:Patient) 
WITH patient 
CALL { 
WITH patient 
MATCH (patient)-[:`isParticipantIn`]->(procedure:`Pa`)-[:`hasResult`]->(result:`ResultValue`)
WHERE (result.hasValue >= 2 AND result.hasValue <= 7 ) 
RETURN DISTINCT patient as patient_inner, procedure, result, 'id1' as id

UNION
  
WITH patient 
MATCH (patient)-[:`isParticipantIn`]->(procedure:`Pb`)-[:`hasResult`]->(result:`ResultValue`)
RETURN DISTINCT patient as patient_inner, procedure, result 'id2' as id

UNION
  
WITH patient 
MATCH (patient)-[:`isParticipantIn`]->(procedure:`Pc`)-[:`hasResult`]->(result:`ResultValue`)
RETURN DISTINCT patient as patient_inner, procedure, result, 'id3' as id

}

RETURN DISTINCT patient.label, procedure.label, result.hasValue, id
匹配(患者:患者)
耐心地
呼叫{
耐心地
匹配(患者)-[:`isParticipantIn`]->(过程:`Pa`)-[:`hasResult`]->(结果:`ResultValue`)
其中(result.hasValue>=2和result.hasValue(过程:`Pb`)-[:`hassresult`]->(结果:`ResultValue`)
返回不同的患者作为患者,程序,结果“id2”作为id
联合
耐心地
匹配(患者)-[:`isParticipantIn`]->(过程:`Pc`)-[:`hasResult`]->(结果:`ResultValue`)
返回不同的患者作为患者,程序,结果,“id3”作为id
}
返回不同的patient.label、procedure.label、result.hasValue、id
其结果是:

这样,我可以收集每个患者的id,并仅保留那些具有“id1”、“id2”和“id3”的患者:

匹配(患者:患者)
耐心地
呼叫{
耐心地
匹配(患者)-[:`isParticipantIn`]->(过程:`Pa`)-[:`hasResult`]->(结果:`ResultValue`)
其中(result.hasValue>=2和result.hasValue(过程:`Pb`)-[:`hassresult`]->(结果:`ResultValue`)
返回不同的患者作为患者,程序,结果“id2”作为id
联合
耐心地
匹配(患者)-[:`isParticipantIn`]->(过程:`Pc`)-[:`hasResult`]->(结果:`ResultValue`)
返回不同的患者作为患者,程序,结果,“id3”作为id
}
对于患者,收集(id)作为id
其中所有(x在['p1','p2','p3']中,其中x在ID中)
返回病人
查询返回patient1,这是正确的。但是,在这里我错过了该患者的过程和结果。我不能在WITH子句中包含过程和结果变量,因为它会修改id的分组。我还尝试收集和释放这些变量,但我想neo4j不知道如何重新设置在展开操作后延迟它们,创建笛卡尔积。此外,我认为我不能使用与id匹配的图形模式,因为id是人工包含的,它不是节点,可能与结果表之外的患者节点无关

我一直在调查自定义过程,但我发现了类似的问题。例如,如果该过程接收到一个节点列表,我必须在调用它之前收集它们,这导致了我前面描述的问题。此外,如果该过程接收到一个节点,它将在结果中每个节点执行一次,我没有相关信息我不确定是否可以定义一个以resultset作为输入的过程,以及用于分组和收集的列,以便执行任何您想要的操作

这方面有什么线索吗?我可以通过处理我显示的第一个查询的结果来处理这个问题,但我更希望在单个查询中有这种行为,而不必手动操作结果


事先谢谢。

经过几天的努力解决这个问题后,我无法在查询中解决它,因此我不得不在我的应用程序代码中对查询结果进行后期处理


我之所以结束这篇文章,是因为我认为我想在Cypher中做的是不可能的。

这是一个很长的阅读过程。你能给我们一些样本来处理数据吗?然后告诉我们你的预期结果。
MATCH (patient:Patient) 
WITH patient 
CALL { 
WITH patient 
MATCH (patient)-[:`isParticipantIn`]->(procedure:`Pa`)-[:`hasResult`]->(result:`ResultValue`)
WHERE (result.hasValue >= 2 AND result.hasValue <= 7 ) 
RETURN DISTINCT patient as patient_inner, procedure, result, 'id1' as id

UNION
  
WITH patient 
MATCH (patient)-[:`isParticipantIn`]->(procedure:`Pb`)-[:`hasResult`]->(result:`ResultValue`)
RETURN DISTINCT patient as patient_inner, procedure, result 'id2' as id

UNION
  
WITH patient 
MATCH (patient)-[:`isParticipantIn`]->(procedure:`Pc`)-[:`hasResult`]->(result:`ResultValue`)
RETURN DISTINCT patient as patient_inner, procedure, result, 'id3' as id

}

RETURN DISTINCT patient.label, procedure.label, result.hasValue, id
MATCH (patient:Patient) 
WITH patient 
CALL { 
WITH patient 
MATCH (patient)-[:`isParticipantIn`]->(procedure:`Pa`)-[:`hasResult`]->(result:`ResultValue`)
WHERE (result.hasValue >= 2 AND result.hasValue <= 7 ) 
RETURN DISTINCT patient as patient_inner, procedure, result, 'id1' as id

UNION
  
WITH patient 
MATCH (patient)-[:`isParticipantIn`]->(procedure:`Pb`)-[:`hasResult`]->(result:`ResultValue`)
RETURN DISTINCT patient as patient_inner, procedure, result 'id2' as id

UNION
  
WITH patient 
MATCH (patient)-[:`isParticipantIn`]->(procedure:`Pc`)-[:`hasResult`]->(result:`ResultValue`)
RETURN DISTINCT patient as patient_inner, procedure, result, 'id3' as id

}

WITH patient, collect(id) as ids
WHERE all(x in ['p1', 'p2', 'p3'] WHERE x IN ids)
RETURN patient