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

San*_*nto 3 database graph neo4j

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

例如,我有一个国家属于子区域,而子区域又属于区域。哪一个更好?在决定方向方面有什么经验法则吗?

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

或者

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

问候桑

cyb*_*sam 5

我同意@InverFalcon 的观点,即方向性主要是一个主观决定。但是,可能(至少)在一种情况下您可能想要使用特定方向,特别是如果这将使重要用例更快的话。

这与以下事实有关:通常,如果您可以使 Cypher 模式不那么具体(不影响输出),那么 Neo4j 将需要做更少的工作,并且您的查询会更快。

例如,假设您的整个数据模型由 2 个节点标签和 2 个关系类型组成,如下所示。(我使用我自己的数据模型,因为我不知道你的用例是什么。)

(:Person)-[:ACTED_IN]->(:Movie)
(:Person)-[:DIRECTED]->(:Movie)
Run Code Online (Sandbox Code Playgroud)

为了查找演员出演的电影,您的查询必须类似于以下内容。(请注意,我们必须指定ACTED_IN类型,因为传出关系也可以是 类型DIRECTED。这意味着 neo4j 必须显式测试每个传出关系的类型):

MATCH (:Person {id: 123})-[:ACTED_IN]->(m:Movie)
RETURN m;
Run Code Online (Sandbox Code Playgroud)

但是,如果您的数据模型用具有相反方向性的DIRECTED类型替换该DIRECTED_BY类型,那么它会看起来像这样:

(:Person)-[:ACTED_IN]->(:Movie)
(:Person)<-[:DIRECTED_BY]-(:Movie)
Run Code Online (Sandbox Code Playgroud)

通过这种调整,您的查询可以更简单、更快(因为 neo4j 不必测试关系类型):

MATCH (:Person {id: 123})-->(m:Movie)
RETURN m;
Run Code Online (Sandbox Code Playgroud)

为了完整起见,请注意,在上述两种MATCH模式中,我们实际上可以删除:Movie标签,因为在这两种数据模型中,ACTED_IN末端节点始终具有Movie标签。