gpt4 book ai didi

nosql - neo4j:单向/双向关系?

转载 作者:行者123 更新时间:2023-12-04 00:05:15 26 4
gpt4 key购买 nike

因此,我研究了neo4j,由于它的数据模型可能非常适合我的项目,因此我可能会在下一个项目中使用它。我浏览了文档,但仍然需要这个问题的答案:

我可以将关系设置为单向吗?

看来neo4j人们喜欢看电影,所以让我们继续吧。如果我有一个这样的图:

Actor A -> [:Acts in] -> Movie B


那么方向很明显,因为节点是不同的类型。

但是我喜欢恐怖电影,所以...

Person A -> [:wants_to_kill] -> Person B


我需要这种关系是单向的,因此如果我查询“ Person A想杀死谁?”如果我询问“ B人想要杀死谁?”,我得到B人。我什么都没有。

有时我仍然需要双向关系

喜欢:

Person A <-[:has_met] -> Person B


...很明显。

文档说:

Relationships are equally well traversed in either direction. This means that there is
no need to add duplicate relationships in the opposite direction (with regard to
traversal or performance).

While relationships always have a direction, you can ignore the direction where it is
not useful in your application.


因此,文档说,默认情况下,关系具有方向,如果愿意,我可以忽略该方向。

现在,事情变得复杂了:

考虑下图(并注意箭头)

Person A <- [:wants_to_kill] -> Person B
Person B -> [:wants_to_kill] -> Person C
Person C -> [:wants_to_kill] -> Person A


如果我忽略所有 [:wants_to_kill]的说明,则会得到错误的结果
代表“ A / C人想杀谁?”
如果我知道必须忽略哪些内容,则不会进行查询。

因此,我可以以某种方式将关系设置为双向的(在创建它们时),还是应该使用两个关系(在人员A和B之间)进行建模?

最佳答案

Neo4j中的关系总是有方向的。如果关系类型的语义不包含方向,例如has_met在您的示例中,那么最佳做法是在创建关系时应用任意方向。然后使用cypher中的“双向”(没有“大于/小于”字符)符号进行查询:

start ... match (a)-[:HAS_MET]-(b) ....


相反,如果关系的语义确实具有与您的 wants_to_kill相似的方向,则需要使用两个关系来表示a和b想要杀死另一个,反之亦然。对于上面的示例,您需要具有4个关系:

Person A -[:wants_to_kill]-> Person B
Person B -[:wants_to_kill]-> Person A
Person B -[:wants_to_kill]-> Person C
Person C -[:wants_to_kill]-> Person A


找到所有想要杀死您的人,您可以:

start a=node:node_auto_index(name='A') match a-[:wants_to_kill]->victims_of_a return victims_of_a


找到所有想要杀死A的人:

start a=node:node_auto_index(name='A') match murderer_of_a-[:wants_to_kill]->a return murderer_of_a

关于nosql - neo4j:单向/双向关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16876378/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com