图形数据库新手问题-如何确定两个节点之间关系的方向

3

如何确定关系的动词方向?

例如,我有一个国家属于一个子区域,而这个子区域又属于一个地区。哪一个更好,并且是否有任何关于决定方向的规则。

(地区)-[拥有]-(子区域)-[拥有]-(国家)

或者

(地区)<-[属于]-(子区域)<-[属于]-(国家)

谢谢 San


1
这几乎是一个纯主观的问题,我可以看到这个问题因此被关闭。关键在于找到对您的领域最有意义的方法,并符合您对建模的模糊程度或特定性的要求。由于Neo4j是灵活的,您可以尝试一种方式一段时间,如果您感觉另一种方式更好,可以使用APOC Procedures重构调用来更改关系类型和/或方向。 - InverseFalcon
实际上,关键在于这个方向意味着什么。当你说一个国家属于一个子地区时,子地区可以属于一个国家吗?如果是这种情况,那么方向就有意义了。如果不是,那么根本不需要使用方向,因为这不是一种可能的情况。避免使用方向是一个好的做法,因为它消除了查询中的许多复杂性。你也可以将语义移动到边缘标签上。 - Alaa Mahmoud
1个回答

5
我同意@InverFalcon的看法,方向性大多是主观决定。然而,可能有(至少)一种情况下,您希望使用特定的方向,特别是如果这将使一个重要的用例更快。
这与事实有关:通常,如果您可以使Cypher模式不太具体(不影响输出),那么neo4j将需要做更少的工作,您的查询将更快。
例如,假设您的整个数据模型只包含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;

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


1
仅仅为了完整性,不要移除Person标签,否则Neo4j会在所有节点中搜索id为123的节点。只有在上述确切情况下移除标签才能加快速度 - MATCH (:Person {id: 123})-->(m:Movie) RETURN m; - Mihai Raulea

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接