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

Database 图形数据库新手Q-如何决定2个节点之间关系的方向,database,graph,neo4j,Database,Graph,Neo4j,你如何决定关系的动词方向 我有一个国家属于一个次区域,而这个次区域又属于一个区域。 哪一个更好?在决定方向上有什么经验法则吗 (区域)-[HAS]->(子区域)-[HAS]->(国家) 或 (地区)我同意@InverFalcon的观点,方向性主要是主观决定。然而,可能(至少)有一种情况下,您可能希望使用特定的方向,特别是如果这将使重要用例更快的话 这与这样一个事实有关:通常,如果您可以降低密码模式的特定性(而不影响输出),那么neo4j将不得不做更少的工作,并且您的查询将更快 例如,假设整个数据

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

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

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


(地区)我同意@InverFalcon的观点,方向性主要是主观决定。然而,可能(至少)有一种情况下,您可能希望使用特定的方向,特别是如果这将使重要用例更快的话

这与这样一个事实有关:通常,如果您可以降低密码模式的特定性(而不影响输出),那么neo4j将不得不做更少的工作,并且您的查询将更快

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

为了找到演员扮演的电影,您的查询必须如下所示。(注意,我们必须在类型中指定
act_,因为传出关系也可以是
定向
类型。这意味着neo4j必须明确测试每个传出关系的类型):

但是,如果您的数据模型将
DIRECTED
类型替换为具有相反方向性的
DIRECTED\u
类型,则它将改为如下所示:

(:Person)-[:ACTED_IN]->(:Movie)
(:Person)<-[:DIRECTED_BY]-(:Movie)

完整地说,请注意,在上面的2个
匹配
模式中,我们实际上可以删除
:Movie
标签,因为在这两个数据模型中,
结束节点中扮演的角色总是有
Movie
标签。

这几乎是一个纯粹的主观问题,我可以看到这个问题因此而被关闭。归根结底,它是对您的领域最有意义的东西,并且适合您对建模所期望的任何模糊或特殊程度。由于Neo4j是灵活的,没有理由不能暂时尝试一种方法,如果您觉得另一种方法更好,可以使用APOC过程重构调用来更改关系类型和/或方向。这实际上可以归结为这个方向意味着什么。当你说国家属于一个次区域时,该次区域是否属于一个国家?如果是这样,那么一个方向可能是有意义的。如果没有,那么根本不要使用方向,因为这不是一个可能的场景。避免方向是一种很好的做法,因为它可以消除查询中的大量复杂性。您也可以将语义移动到边缘标签;不应删除人员标签,否则Neo4j将在所有节点中搜索id:123。移除标签只会加快上述情况下的速度-MATCH(:Person{id:123}-->(m:Movie)RETURN m;
MATCH (:Person {id: 123})-[:ACTED_IN]->(m:Movie)
RETURN m;
(:Person)-[:ACTED_IN]->(:Movie)
(:Person)<-[:DIRECTED_BY]-(:Movie)
MATCH (:Person {id: 123})-->(m:Movie)
RETURN m;