Neo4j - 用于在两个独立集合中查找节点之间关系的cypher语法

时间:2015-03-30 21:54:26

标签: neo4j cypher

我开发了以下查询来查找满足特定查询条件的所有节点。具体而言,满足某些参数的所有疾病代码。我已经使用UNION在代码中完成了这个:

//Find all diagnosis codes
MATCH p = (a:ObjectConcept{sctid:233604007}) <-[:ISA*]- (b:ObjectConcept),
      q = (c:ObjectConcept{sctid:58800005})<-[:ISA*]-(d:ObjectConcept) 
WHERE NOT (b)-->()--(c) AND NOT (b)-->()-->(d) 
RETURN distinct b 
UNION  
MATCH p = (a:ObjectConcept{sctid:233604007}) <-[:ISA*]- (b:ObjectConcept), 
      t = (e:ObjectConcept{sctid:65119002})<-[:ISA*]-(f:ObjectConcept) 
WHERE NOT (b)-->()-->(e) AND NOT (b)-->()-->(f) 
RETURN distinct b

我想关心此查询的结果。这是一组(不同的b),并找到所有患有这些疾病的患者。

Pseudo-code: Match s = (nodes in distinct b) <-[:HAS_DX]- (z:Patient) 
RETURN  distinct z

但是,我不知道Cypher语法将一组不同的节点b带入此后续查询语句中。我正在使用Neo4j v 2.1.7。

由于

2 个答案:

答案 0 :(得分:1)

此查询是否适合您?

MATCH p = (a:ObjectConcept{sctid:233604007})<-[:ISA*]-(b:ObjectConcept)<-[:HAS_DX]-(z:Patient),
      q = (c:ObjectConcept)<-[:ISA*]-(d:ObjectConcept) 
WHERE (c.sctid = 58800005 OR c.sctid = 65119002) AND NOT (b)-->()-->(c) AND NOT (b)-->()-->(d) 
RETURN DISTINCT z;

答案 1 :(得分:0)

以下查询成功。它需要将所需输出的所有方面与每个子查询进行匹配,以使列标题完全相同。查询时间增加不到1秒。

MATCH p = (a:ObjectConcept{sctid:233604007}) <-[:ISA*]- (b:ObjectConcept),
      q = (c:ObjectConcept{sctid:58800005})<-[:ISA*]-(d:ObjectConcept) 
WHERE NOT (b)-->()--(c) AND NOT (b)-->()-->(d) 
with distinct b
MATCH (t:Patient)-[:HAS_DX]-> (b)
RETURN distinct t.patient_id,b.FSN 
UNION  
MATCH p = (a:ObjectConcept{sctid:233604007}) <-[:ISA*]- (b:ObjectConcept), 
      t = (e:ObjectConcept{sctid:65119002})<-[:ISA*]-(f:ObjectConcept) 
WHERE NOT (b)-->()-->(e) AND NOT (b)-->()-->(f) 
with distinct b
MATCH (t:Patient)-[:HAS_DX]-> (b)
RETURN distinct t.patient_id,b.FSN;