Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Design patterns 图数据库的边定义_Design Patterns_Database Design_Graph - Fatal编程技术网

Design patterns 图数据库的边定义

Design patterns 图数据库的边定义,design-patterns,database-design,graph,Design Patterns,Database Design,Graph,我们将收到传达以下信息的数据: Object1 **is related to** Object2 Object1 **has relationship ID R1** with Object2 Object1和Object2都与任意数量的对象进一步相关。与相关的“轴”将用于递归地回答查询,例如“谁与Object1相关”。并且,的“轴”具有关系ID R1将用于回答诸如“谁是关系ID R1的当事人”之类的查询 我有Neo4j的入门知识,问题不在于在这样的图上执行CRUD的代码。看起来,边的数量应

我们将收到传达以下信息的数据:

Object1 **is related to** Object2
Object1 **has relationship ID R1** with Object2
Object1
Object2
都与任意数量的对象进一步相关。
相关的“轴”将用于递归地回答查询,例如“谁与Object1相关”。并且,
的“轴”具有关系ID R1
将用于回答诸如“谁是关系ID R1的当事人”之类的查询

我有Neo4j的入门知识,问题不在于在这样的图上执行CRUD的代码。看起来,边的数量应该等于(可以预见)将在两个顶点之间运行的查询类型


你能给我一个设计模式来定义这个数据库吗

如果我理解正确,您关心的是由于边缘类型不断增加而导致的架构更改的影响

在中,可以使用模式中的值定义边,以便可以使用单个类型表示多个边类型(“轴”),该类型与指示边类型的枚举字段相关联。然后在查询中写入:

g.V(a).outE(e => e.type == EdgeType.isRelatedTo).outV(b => ...)
g.V(b).outE(e => e.type == EdgeType.hasRelationshipIDR1).outV(a => ...)
此图案也适用于不明确支持带值边的后端,因为您可以将边建模为顶点:

g.V(a).outE().outV(e => e.type == EdgeType.isRelatedTo).outE().outV(b => ...)
g.V(b).outE().outV(e => e.type == EdgeType.hasRelationshipIDR1).outE().outV(a => ...)

其中代价是额外的遍历步骤。

如果我理解正确,您关心的是由于边缘类型的增加而导致的架构更改的影响

在中,可以使用模式中的值定义边,以便可以使用单个类型表示多个边类型(“轴”),该类型与指示边类型的枚举字段相关联。然后在查询中写入:

g.V(a).outE(e => e.type == EdgeType.isRelatedTo).outV(b => ...)
g.V(b).outE(e => e.type == EdgeType.hasRelationshipIDR1).outV(a => ...)
此图案也适用于不明确支持带值边的后端,因为您可以将边建模为顶点:

g.V(a).outE().outV(e => e.type == EdgeType.isRelatedTo).outE().outV(b => ...)
g.V(b).outE().outV(e => e.type == EdgeType.hasRelationshipIDR1).outE().outV(a => ...)

其中代价是额外的遍历步骤。

您的问题太笼统了。无论如何,要创建图形,必须提及所有节点和边(例如:
a-[:isRelatedTo]->b
b-[:hasRelationshipIDR1]->a
,使用cypher语言)。如果你的问题写得更详细,我会帮你的。谢谢,@OmG。首先,我同意,这是一个一般性问题。第二,我可能不一定事先知道所有的边缘。我可能知道,节点提前或至少安全地预测。我该如何设计这种增长?你的问题太笼统了。无论如何,要创建图形,必须提及所有节点和边(例如:
a-[:isRelatedTo]->b
b-[:hasRelationshipIDR1]->a
,使用cypher语言)。如果你的问题写得更详细,我会帮你的。谢谢,@OmG。首先,我同意,这是一个一般性问题。第二,我可能不一定事先知道所有的边缘。我可能知道,节点提前或至少安全地预测。我如何为这种增长进行设计?“如果我理解正确,您关心的是由于边缘类型集不断增加而导致的架构更改的影响。”这是正确的。感谢您对图形引擎的提示。(令人惊喜的是,这是Microsoft提供的!)“如果我理解正确,您关心的是由于边缘类型的不断增加而导致的架构更改的影响。”这是正确的。感谢您对图形引擎的提示。(得知这是来自微软,我感到惊喜!)