我开发了以下查询来查找满足特定查询条件的所有节点。具体而言,满足某些参数的所有疾病代码。我已经使用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。
由于
答案 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;