图数据库,有效地建模三节点组合关系

时间:2015-08-21 12:24:54

标签: mysql graph neo4j cypher graph-databases

我在neo4j - Relationship between three nodes中遇到了同样的问题。我是Neo4J的新手,想要将关系数据库建模为图形。

我有三种类型的数据,A,B和C.B,B1的实例可以属于C,C1的实例,A的实例,A1可以属于B1和C1,但是如果和只有B1属于C1。这里的问题是,我也可以有属于B2的A1属于C1,A1也属于属于C2的B1。这些将是三个合法的,单独的组合。所以,在我的数据库中,我会有一个连接表,在记录中我会保留三个ID的组合,表示实例形成的关系。

现在,根据我的想法,hyperedges就像我正在搜索的那样(http://neo4j.com/docs/stable/cypher-cookbook-hyperedges.html)。对于初学者来说,我在考虑添加这样的关系:

A - [:PART_OF] - GT;三

乙 - [:PART_OF] - GT;三

Ç - [:PART_OF] - GT;三

第一个问题/问题:如果要删除B类实例,则三重节点将保留。我猜我在删除东西时会以某种方式处理这个问题吗?

第二个问题/问题:我的主要问题是,如果我增加一些关系会更有效吗?例如A - [:BELONGS_TO] - > C.所以,如果我想要A1所属的所有类型C实例,我可以用一跳返回结果。关系遍历的数量将少于必须访问的“三重”类型节点。我想基本上我在问Neo4j是如何在内部寻找模式的(它从哪里开始,是否重新检查节点等)。因为我猜想(可能是错误的)如果我想要A1所属的Cs,我会写一些类似的东西:

匹配A1 - [:PART_OF] - > triple< - [:PART_OF] -C 返回C

该查询将如何运作?首先检索所有三元组A1是其中的一部分,然后那些所有C类型都是其中的一部分并最终返回匹配项?

任何提示? 提前谢谢。

1 个答案:

答案 0 :(得分:0)

如果我理解正确,你真的想要代表transitive关系,如:

(:A)-[:BELONGS_TO]->(:B)-[:BELONGS_TO]->(:C)

如果是这样,就不需要使用"三元组",因为neo4j可以很容易地表示和处理传递关系。

假设您的测试数据(如您的问题中所述)是以这种方式创建的:

CREATE
  (a1:A {name:"a1"}),
  (b1:B {name:"b1"}), (b2:B {name:"b2"}),
  (c1:C {name:"c1"}), (c2:C {name:"c2"}),
  (a1)-[:BELONGS_TO]->(b1),
  (b1)-[:BELONGS_TO]->(c1),
  (b1)-[:BELONGS_TO]->(c2),
  (a1)-[:BELONGS_TO]->(b2),
  (b2)-[:BELONGS_TO]->(c1)

使用该数据,您可以使用以下查询来获取特定C节点间接所属的A个节点。此查询还会返回已使用的路径,因为任何特定AC对之间可能存在多条路径。显示此工作的Here is a console

MATCH p=(:A { name:"a1" })-[:BELONGS_TO*2..2]->(c:C)
RETURN p, c;

如果您只想在结果中使用不同的C节点,则可以这样做:

MATCH (:A { name:"a1" })-[:BELONGS_TO*2..2]->(c:C)
RETURN DISTINCT c;