在neo4j中建模序列路径的最佳方法是什么?

时间:2014-08-19 15:35:54

标签: neo4j cypher

让我们说我的图表是一系列步骤,它们在一个过程中相互连接。是否有最佳/推荐的方法在图表中对此进行建模?

我可以想到两种不同的方法:

第一名:

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"但是我买了必须指定序列号的问题,所以我知道步骤应该在哪个顺序。

这个问题在此之前必须已经解决了十几次。是否有更好/最佳模式将其建模为图形?

2 个答案:

答案 0 :(得分:1)

我认为索引搜索不是一个好主意 最好使用标签扫描 我们不能在关系上使用几个标签,并且有64k关系类型限制 如果你的需求不超过这个限制,你可以使用这样的东西

a-[:STEP_FOO]-b-[STEP_BAR]-c

答案 1 :(得分:1)

以下方法可能适合您的需求。它创建了一个以Procedure节点为根的Step节点链。

“过程”节点还具有LAST_STEP关系以指向当前最后一个“步骤”节点,以尝试启用更高性能的新步骤节点附加。但是可能有更有效的方法来解决这个问题。

此方法的一个可能缺点是您无法参数化#4中的步骤数。

  1. 要启动过程的步骤链,请从 第一步:

    CREATE (p:Procedure {name: "Foo"})-[:LAST_STEP]->(s:Step {...}), (p)-[:NEXT_STEP]->(s);
    
  2. 要在链的末尾添加一个步骤:

    MATCH (p:Procedure {name: "Foo"})-[ls:LAST_STEP]->(s)
    DELETE ls
    CREATE (p)-[:LAST_STEP]->(s1:Step {...})
    CREATE (s)-[:NEXT_STEP]->(s1);
    
  3. 获取链的第一步(如果没有步骤则为null):

    MATCH (p:Procedure {name: "Foo"})-[:NEXT_STEP]->(s)
    RETURN s;
    
  4. 获取链的第3步,如果步数少于3步则为null(可以用任意数字替换3):

    MATCH (p:Procedure {name: "Foo"})-[:NEXT_STEP*3]->(s)
    RETURN s;
    
  5. 要获得步骤s之后的步骤(假设我们已经以某种方式s):

    ...
    MATCH (s)-[:NEXT_STEP]->(s1)
    RETURN s1;
    
  6. 按顺序获取链中的所有步骤:

    MATCH (p:Procedure {name: "Foo"})-[ns:NEXT_STEP*]->(s)
    RETURN s ORDER BY length(ns);