San*_*nto 3 database graph neo4j
你如何决定关系的动词方向?
例如,我有一个国家属于子区域,而子区域又属于区域。哪一个更好?在决定方向方面有什么经验法则吗?
(地区)-[HAS]->(子区域)-[HAS]->(国家/地区)
或者
(区域)<-[BELONGS_TO]-(子区域)<-[BELONGS_TO]-(国家/地区)
问候桑
我同意@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标签。