【问题标题】:How to determine the direction of an edge between vertexes in a Graph Database such as OrientDB如何确定图形数据库(如 OrientDB)中顶点之间的边的方向
【发布时间】:2020-08-30 06:14:57
【问题描述】:

在像 OrientDB 这样的图形数据库中,我们如何知道一条边是 out() 还是 in()?我知道边充当顶点之间的链接(这与 RDMS 中的表之间的关系相同),但是我们如何确定方向。例如,我有一些 Lecturer 和 Courses 的顶点,在这里,我想要一 (1) 个 Lecturer 到许多 Courses,即一对多的关系。那么讲师和课程之间的边缘方向是什么,是in()来自讲师还是out()来自讲师我的意思是我如何使用“select in()从讲师”或选择来编写查询out() 来自讲师?谢谢。

【问题讨论】:

    标签: orientdb graph-databases


    【解决方案1】:

    边的方向与域完全相关,不会影响遍历性能(即,从顶点开始,您可以遍历传入边与传出边的性能完全相同)。

    重要的是以有意义的方式定义边缘“名称”,以便边缘方向明确。

    我会尝试用一个例子来澄清

    假设您有两个顶点类:Person 和 Car。 假设您想在两者之间创建关系,以表示所有权(即,一个人拥有一辆汽车)。

    考虑这两种表示关系的方式:

    Person -Owns-> Car
    

    Person <-BelongsTo- Car
    

    如您所见,两者都很清晰并且很好地代表了领域。

    当然,您有无限的选择来选择边缘名称(顺便说一句,动词通常是一个非常好的选择),因此您可以选择“所有权”之类的名称。这绝对是一个糟糕的选择,因为它不会明确方向,例如。

    是吗

    Person -Ownership-> Car
    

    是吗

    Person <-Ownership- Car
    

    想象一下,在您不使用它的几个月后,您必须对这个架构进行查询,其中有数十个语义上不明确的关系。你看问题...

    最后,只是模型是否清晰的问题。这是人的问题,不是技术问题。

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      无向与有向边

      无向:

      A -(边缘)-B

      A可以遍历到B,B可以遍历到A

      优点:在处理无向(对称)或双向关系时很简单。 示例:“B 的朋友”⇔“A 的朋友”

      缺点:不携带方向信息。

      有向边

      A -(边缘)-> B

      A可以遍历到B,但是B不能遍历到A

      优点:节省内存并正确描述方向受限的关系 示例:“A parent_of B”⇏“B parent_of A”

      缺点:无法从目标返回到源。

      关于您的问题 - 如果是我,我会为您的用例选择无向的,因为我很可能想要双向进行。

      【讨论】:

      • 谢谢,Herk,这意味着它可以是 out() go 或 in()coming edge(双向)?
      • 在像hibernate这样的ORM映射的情况下,我们可以清楚地指定我们想要的双向映射还是单向映射,但是这里我怎么知道我在做的是单向还是双向呢?
      • 这绝对是不准确的:在 OrientDB 中没有无向边(有链接,但这是一个完全不同的概念),所有边都是有向的,并且它们可以在两个方向上以完全相同的方式遍历性能。
      • OP - “我们如何知道一条边是在 OrientDB 等图形数据库中的输出()还是输入()”提供的答案确实准确地解释了。是的,并非所有图表都相同,但这不值得一票否决。
      猜你喜欢
      • 2018-04-30
      • 1970-01-01
      • 1970-01-01
      • 2021-05-28
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-02-12
      相关资源
      最近更新 更多