组合不同的Neo4j密码查询

组合不同的Neo4j密码查询,neo4j,cypher,Neo4j,Cypher,我目前正在使用以下三个查询从数据库中提取一些信息 MATCH (u:User { id: "1" }), (x:Label) WHERE (u)-[:SEES]->(x) RETURN collect(x) as labels MATCH (u:User { id: "1" }), (x:Label) WHERE (u)-[:SEES]->(x) AND NOT((x)-[:CLASSIFIES]->()) AND NOT(()-

我目前正在使用以下三个查询从数据库中提取一些信息

 MATCH (u:User { id: "1" }), (x:Label)  
 WHERE (u)-[:SEES]->(x) 
RETURN collect(x) as labels

 MATCH (u:User { id: "1" }), (x:Label)  
 WHERE (u)-[:SEES]->(x)    
   AND NOT((x)-[:CLASSIFIES]->())    
   AND NOT(()-[:CLASSIFIES]->(x)) 
RETURN collect(x) as uniquelabels

 MATCH (u:User { id: "1" }), p=(a:Label)-[:CLASSIFIES*]->(b:Label)  
 WHERE ALL(n IN nodes(path) WHERE ((u)-[:SEES]->(n)))
   AND NOT(()-[:CLASSIFIES]->(a))    
   AND NOT((b)-[:CLASSIFIES]->())   
  WITH collect(extract(n IN nodes(p) | n.id)) as paths 
RETURN distinct paths

将这些查询合并为一个查询的正确方法是什么

首先,我建议不要在
WHERE
子句中使用
MATCH
语法(ASCII艺术箭头语法),除非您正在执行
not()

我认为您应该能够这样使用:

 MATCH (u:User { id: "1" })-[:SEES]->(x:Label)  
RETURN extract(n IN collect(distinct x) | n.id) as labels
   UNION
 MATCH (x:Label)  
 WHERE NOT((x)-[:CLASSIFIES]-())    
RETURN extract(n IN collect(distinct x) | n.id) as uniquelabels
   UNION
 MATCH (u:User { id: "1" }), p=(a:Label)-[:CLASSIFIES*]->(b:Label)  
 WHERE ALL(n IN nodes(path) WHERE ((u)-[:SEES]->(n)))
   AND NOT(()-[:CLASSIFIES]->(a))    
   AND NOT((b)-[:CLASSIFIES]->())   
 RETURN DISTINCT collect(extract(n IN nodes(p) | n.id))
也许有一种更优雅的方法可以实现这一点,不过,我还没有仔细研究这些查询