图数据库,高效建模三节点组合关系
Graph Database, Modeling three node combination relationship efficiently
我偶然发现了与 neo4j - Relationship between three nodes 中相同的问题。我是 Neo4J 的新手,想将关系数据库建模为图形。
我有A、B、C三种数据,B的一个实例B1可以属于C的一个实例C1,A的一个实例A1可以属于B1和C1,但是当且仅当 B1 属于 C1。这里的问题是,我也可以让 A1 属于 B2,B2 属于 C1,A1 也属于 B1,B1 属于 C2。这些将是三个合法的、独立的组合。因此,在我的数据库中,我将有一个连接 table,在记录中我将保留三个 ID 的组合,表示实例形成的关系。
现在,据我所知,超边就是我正在搜索的内容 (http://neo4j.com/docs/stable/cypher-cookbook-hyperedges.html)。对于初学者,我在想添加如下关系:
A-[:PART_OF]->三重
B-[:PART_OF]->三重
C-[:PART_OF]->三重
1st problem/question:如果要删除B型实例,则三重节点将保留。我猜我在删除东西时必须以某种方式处理这个问题?
2nd problem/question:我的主要问题是,如果我添加更多关系,效率会更高吗?例如 A-[:BELONGS_TO]->C。所以,如果我想要 A1 所属的所有类型 C 实例,我可以通过一跳返回结果。关系遍历的数量将少于必须访问的 "triple" 类型节点。我想基本上我是在问 Neo4j 如何在内部寻找模式(它从哪里开始,它是否重新检查节点等)。因为我在猜测(可能是错误的)如果我想要 A1 所属的 Cs,我会写这样的东西:
匹配A1-[:PART_OF]->三重<-[:PART_OF]-C
return C
该查询将如何工作?首先检索 A1 所属的所有三元组,然后检索所有 C 类型所属的那些,最后 return 匹配项?
有什么提示吗?
提前致谢。
如果我没理解错的话,你真的想表示一个 transitive 关系,如:
(:A)-[:BELONGS_TO]->(:B)-[:BELONGS_TO]->(:C)
如果是这样,就没有必要使用"triplets",因为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)
使用该数据,您可以使用以下查询获取特定 A
节点间接属于的 C
个节点。此查询还 returns 使用的路径,因为在任何特定的 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;
我偶然发现了与 neo4j - Relationship between three nodes 中相同的问题。我是 Neo4J 的新手,想将关系数据库建模为图形。
我有A、B、C三种数据,B的一个实例B1可以属于C的一个实例C1,A的一个实例A1可以属于B1和C1,但是当且仅当 B1 属于 C1。这里的问题是,我也可以让 A1 属于 B2,B2 属于 C1,A1 也属于 B1,B1 属于 C2。这些将是三个合法的、独立的组合。因此,在我的数据库中,我将有一个连接 table,在记录中我将保留三个 ID 的组合,表示实例形成的关系。
现在,据我所知,超边就是我正在搜索的内容 (http://neo4j.com/docs/stable/cypher-cookbook-hyperedges.html)。对于初学者,我在想添加如下关系:
A-[:PART_OF]->三重
B-[:PART_OF]->三重
C-[:PART_OF]->三重
1st problem/question:如果要删除B型实例,则三重节点将保留。我猜我在删除东西时必须以某种方式处理这个问题?
2nd problem/question:我的主要问题是,如果我添加更多关系,效率会更高吗?例如 A-[:BELONGS_TO]->C。所以,如果我想要 A1 所属的所有类型 C 实例,我可以通过一跳返回结果。关系遍历的数量将少于必须访问的 "triple" 类型节点。我想基本上我是在问 Neo4j 如何在内部寻找模式(它从哪里开始,它是否重新检查节点等)。因为我在猜测(可能是错误的)如果我想要 A1 所属的 Cs,我会写这样的东西:
匹配A1-[:PART_OF]->三重<-[:PART_OF]-C return C
该查询将如何工作?首先检索 A1 所属的所有三元组,然后检索所有 C 类型所属的那些,最后 return 匹配项?
有什么提示吗? 提前致谢。
如果我没理解错的话,你真的想表示一个 transitive 关系,如:
(:A)-[:BELONGS_TO]->(:B)-[:BELONGS_TO]->(:C)
如果是这样,就没有必要使用"triplets",因为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)
使用该数据,您可以使用以下查询获取特定 A
节点间接属于的 C
个节点。此查询还 returns 使用的路径,因为在任何特定的 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;