我同意@InverFalcon 的观点,即方向性主要是一个主观决定。但是,可能(至少)在一种情况下您可能想要使用特定方向,特别是如果这将使重要用例更快的话。
这与以下事实有关:通常,如果您可以制作 Cypher 图案不太具体(不影响输出),那么neo4j将需要做更少的工作,并且你的查询会更快。
例如,假设您的整个数据模型由 2 个节点标签和 2 个关系类型组成,如下所示。 (我使用我自己的数据模型,因为我不知道你的用例是什么。)
(:Person)-[:ACTED_IN]->(:Movie)
(:Person)-[:DIRECTED]->(:Movie)
为了查找演员出演的电影,您的查询必须类似于以下内容。 (请注意,我们必须指定ACTED_IN
类型,因为传出关系也可以是类型DIRECTED
。这意味着 neo4j 必须显式测试其类型的每个传出关系):
MATCH (:Person {id: 123})-[:ACTED_IN]->(m:Movie)
RETURN m;
但是,如果您的数据模型替换了DIRECTED
键入DIRECTED_BY
输入具有相反方向性的类型,那么它看起来像这样:
(:Person)-[:ACTED_IN]->(:Movie)
(:Person)<-[:DIRECTED_BY]-(:Movie)
通过这种调整,您的查询可以更简单、更快(因为 neo4j 不必测试关系类型):
MATCH (:Person {id: 123})-->(m:Movie)
RETURN m;
为了完整起见,请注意上面 2 中MATCH
我们实际上可以删除的模式:Movie
标签,因为在这两个数据模型中ACTED_IN
端节点总是有Movie
label.