你如何决定关系的动词方向?
例如,我有一个国家属于一个子区域,而该区域又属于一个区域。 哪一个会更好,是否有任何拇指规则决定方向。
(地区) - [HAS] - >(子地区) - [HAS] - >(国家/地区)
或
(地区)< - [BELONGS_TO] - (子地区)< - [BELONGS_TO] - (国家)
此致 圣
答案 0 :(得分:3)
我同意@InverFalcon的说法,方向性主要是一个主观决定。但是,可能存在(至少)一种情况,您可能希望使用特定方向,特别是如果这样可以更快地使用一个重要用例。
这与以下事实有关:如果你可以使Cypher模式不那么具体(不影响输出),那么neo4j将不得不做更少的工作,你的查询会更快。< / p>
例如,假设您的整个数据模型由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
标签。