我在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类型都是其中的一部分并最终返回匹配项?
任何提示? 提前谢谢。
答案 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
个节点。此查询还会返回已使用的路径,因为任何特定A
和C
对之间可能存在多条路径。显示此工作的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;