图数据库新手Q-如何确定2个节点之间关系的方向

时间:2016-11-10 15:46:50

标签: database graph neo4j

你如何决定关系的动词方向?

例如,我有一个国家属于一个子区域,而该区域又属于一个区域。 哪一个会更好,是否有任何拇指规则决定方向。

(地区) - [HAS] - >(子地区) - [HAS] - >(国家/地区)

(地区)< - [BELONGS_TO] - (子地区)< - [BELONGS_TO] - (国家)

此致 圣

1 个答案:

答案 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标签。