让我们说我的图表是一系列步骤,它们在一个过程中相互连接。是否有最佳/推荐的方法在图表中对此进行建模?
我可以想到两种不同的方法:
第一名:
CREATE [s1:Step]-[r1:step { procedure: "Foo" }]->[s2:Step]
在这种方法中,我需要检查step
关系的属性以重建整个过程。只需按照标记为过程的所有关系:Foo。
第二名:
CREATE (p:Procedure {name: "Foo"}),
(s1:Step), (s2:Step),
p-[:step { sequence: 0 }]->s1,
p-[:step { sequence: 1 }]->s2;
这创建了一个真正的一流程序" node"但是我买了必须指定序列号的问题,所以我知道步骤应该在哪个顺序。
这个问题在此之前必须已经解决了十几次。是否有更好/最佳模式将其建模为图形?
答案 0 :(得分:1)
我认为索引搜索不是一个好主意 最好使用标签扫描 我们不能在关系上使用几个标签,并且有64k关系类型限制 如果你的需求不超过这个限制,你可以使用这样的东西
a-[:STEP_FOO]-b-[STEP_BAR]-c
答案 1 :(得分:1)
以下方法可能适合您的需求。它创建了一个以Procedure节点为根的Step节点链。
“过程”节点还具有LAST_STEP关系以指向当前最后一个“步骤”节点,以尝试启用更高性能的新步骤节点附加。但是可能有更有效的方法来解决这个问题。
此方法的一个可能缺点是您无法参数化#4中的步骤数。
要启动过程的步骤链,请从 第一步:
CREATE (p:Procedure {name: "Foo"})-[:LAST_STEP]->(s:Step {...}), (p)-[:NEXT_STEP]->(s);
要在链的末尾添加一个步骤:
MATCH (p:Procedure {name: "Foo"})-[ls:LAST_STEP]->(s) DELETE ls CREATE (p)-[:LAST_STEP]->(s1:Step {...}) CREATE (s)-[:NEXT_STEP]->(s1);
获取链的第一步(如果没有步骤则为null):
MATCH (p:Procedure {name: "Foo"})-[:NEXT_STEP]->(s) RETURN s;
获取链的第3步,如果步数少于3步则为null(可以用任意数字替换3
):
MATCH (p:Procedure {name: "Foo"})-[:NEXT_STEP*3]->(s) RETURN s;
要获得步骤s
之后的步骤(假设我们已经以某种方式s
):
... MATCH (s)-[:NEXT_STEP]->(s1) RETURN s1;
按顺序获取链中的所有步骤:
MATCH (p:Procedure {name: "Foo"})-[ns:NEXT_STEP*]->(s) RETURN s ORDER BY length(ns);