我如何定义Neo4j节点属性从2个可能的路径与密码查询?



对于neo4j/cypher来说是全新的。我试图返回一个属性,由2个不同的路径访问,这取决于标签,在这种情况下,(n)的标签。

MATCH (k:KeyNode)<-[:BASED_ON]-(n)-[:CONTROLS|:MODIFIES]->()
WHERE id(k)=123456
//if label(n) = LabelA
OPTIONAL MATCH (n)<-[:LABEL_A_REL]-(c:Controller)-[:CONTROLS]->(r:Resource)-[:TYPE_OF]->(rt:ResourceType) 
//if label(n) = NotLabelA
OPTIONAL MATCH (n)-[:LABEL_NOT_A_REL]->(r:Resource)-[:TYPE_OF]->(rt:ResourceType) 
OPTIONAL MATCH (r)-[:PARENT*]->(ro:Room) 
RETURN ID(r) as resourceId, ID(ro) as siteId, ID(rt) as rt:ResourceType

就这样,路径定义的第一个可选匹配和它定义的节点优先,留下第二个opt匹配/路径节点的重新定义不变,我想是因为cypher不会重新定义变量。目标是在2个可能的路径上找到(r)和(rt)。

我考虑使用CASE WHEN结构,但从文档中我只看到返回单个属性的选项,而不是多个(尽管我可能是错误的)

这可能是一种方法:

MATCH (k:KeyNode)<-[:BASED_ON]-(n)-[:CONTROLS|:MODIFIES]->()
WHERE id(k)=123456
OPTIONAL MATCH (n)<-[:LABEL_A_REL]-(c:Controller)-[:CONTROLS]->(r1:Resource)-[:TYPE_OF]->(rt1:ResourceType)
OPTIONAL MATCH (n)-[:LABEL_NOT_A_REL]->(r2:Resource)-[:TYPE_OF]->(rt2:ResourceType)
// COALESCE to deal with precedence
WITH COALESCE(r1,r2) AS r,
COALESCE(rt1,rt2) AS rt
OPTIONAL MATCH (r)-[:PARENT*]->(ro:Room)
RETURN ID(r) as resourceId, ID(ro) as siteId, ID(rt) as rt:ResourceType