NEO4J-匹配中间节点可能存在或不存在的路径

NEO4J-匹配中间节点可能存在或不存在的路径,neo4j,cypher,Neo4j,Cypher,我有以下图表: 我希望得到所有承包商、分包商和客户,从David开始。 所以我想到了这样一个问题: MATCH(a:承包商)-[*0..1]->(b)-[w:工程]->(c:客户)返回a、b、c 这将返回: (0:contractor {name:"David"}) (0:contractor {name:"David"}) (56:client {name:"Sarah"}) (0:contractor {name:&quo

我有以下图表:

我希望得到所有承包商、分包商和客户,从David开始。 所以我想到了这样一个问题:

MATCH(a:承包商)-[*0..1]->(b)-[w:工程]->(c:客户)返回a、b、c

这将返回:

(0:contractor {name:"David"})   (0:contractor {name:"David"})   (56:client {name:"Sarah"})
(0:contractor {name:"David"})   (1:subcontractor {name:"John"}) (56:client {name:"Sarah"})
返回所需的结果。这里的问题是性能。 如果数据库包含数百万条记录,而我离开(b)时没有标签,那么查询将花费永远的时间。如果我在
(b)
中添加一个标签,例如
(b:分包商)
,我不会点击数百万行,但我只会得到分包商的结果:

(0:承包商{name:“David”})(1:分包商{name:“John”})(56:客户{name:“Sarah”})

有没有更有效的方法


链接到图示例:

,在查询中有一些事情需要考虑。 未指定关系类型-是否只有来自

承包商
节点的关系是
工程(针对
租用
)?如果不匹配,则应约束查询中匹配的关系类型。比如说

MATCH (a:contractor)-[:works_for|:hired*0..1]->(b)-[w:works_for]->(c:client) 
RETURN a,b,c
(b)未标记并不意味着图中的每个节点都将匹配。通过遍历
工程或
雇佣关系(如有规定),或通过
:承包商的任何关系,或通过
工程关系(如有规定),可以达到该目标

如果确实要为其添加标签,并且具有类型层次结构,则可以将多个标签指定给节点,并在查询中使用最常用的标签。例如,您可以使用诸如
ExternalStaff
之类的标签作为通用标签,然后进一步添加
Contractor
SubContractor
以区分各个节点。然后你可以做类似的事情

MATCH (a:contractor)-[:works_for|:hired*0..1]->(b:ExternalStaff)-[w:works_for]->(c:client) 
RETURN a,b,c

这完全取决于您的用例。

谢谢,[:works_for |:hired]似乎可以做到这一点(此语法已被弃用,现在编写为[:works_for | hired])。关于添加新的通用标签,在我们当前的体系结构中是不可能的。还有其他可能性吗?