2017-02-15 65 views
0

以下基本图:获得的唯一路径数量穿越而穿越利用我创建的Neo4j穿越API

CREATE (:NodeType1 {prop1:'value1'})-[:RelType1 {prop2:'value2'}]->(:NodeType2 {prop3:'value3'})-[:RelType2 {prop4:'value4'}]->(:NodeType3 {prop5:'value5'})-[:RelType3 {prop6:'value6'}]->(:NodeType4 {prop7:'value7'}) 

CREATE (:NodeType1 {prop1:'value8'})-[:RelType1 {prop2:'value9'}]->(:NodeType2 {prop3:'value10'})-[:RelType2 {prop4:'value11'}]->(:NodeType3 {prop5:'value12'})-[:RelType3 {prop6:'value13'}]->(:NodeType4 {prop7:'value14'}) 

MATCH path=(n:NodeType1 {prop1:'value1'})-[*]->(m:NodeType4 {prop7:'value7'}) 
CREATE (n)-[:RelType1 {prop2:'value15'}]->(:NodeType2 {prop3:'value16'})-[:RelType2 {prop4:'value17'}]->(:NodeType3 {prop5:'value18'})-[:RelType3 {prop6:'value19'}]->(m) 

图表看起来是这样的:

enter image description here

当我运行以下暗号:

MATCH path=(a:NodeType1 {prop1:"value1"})-[:RelType1]->(b)-[:RelType2]->(c)-[:RelType3]->(d) 
RETURN count(nodes(path)) 

我得到2 as out放。看来,nodes()犯规实际上返回路径中的节点数目,但在返回结果行的只是数量,因为如果我返回path

MATCH path=(a:NodeType1 {prop1:"value1"})-[:RelType1]->(b)-[:RelType2]->(c)-[:RelType3]->(d) 
RETURN path 

我得到的返回结果两行:

enter image description here

现在我猜测如何在使用Neo4J遍历API进行遍历时获得相同的输出。我得到密码中唯一节点的数量如下:

MATCH path=(a:NodeType1 {prop1:"value1"})-[:RelType1]->(b)-[:RelType2]->(c)-[:RelType3]->(d) 
RETURN size(collect(distinct a))+size(collect(distinct b))+size(collect(distinct c))+size(collect(distinct d)) 

以上查询正确返回6

通过在路径扩展器内部设置静态计数器,每遍调用expand()就可以在遍历API中完成相同操作。 (对此有任何更好的方法?)

public class MyPathExpander implements PathExpander{ 
    static int nodeCount = 0; 

    @Override 
    public Iterable expand(Path path, BranchState state) { 
     Node lastNode = path.endNode(); 

     nodeCount++; //**increment the count of nodes visited 

     if(lastNode.hasLabel(MyLabels.NodeType1)) 
      return lastNode.getRelationships(MyRelations.RelType1, Direction.OUTGOING); 
     else if (lastNode.hasRelationship(MyRelations.RelType1, Direction.INCOMING)) 
      return lastNode.getRelationships(MyRelations.RelType2, Direction.OUTGOING); 
     else if (lastNode.hasRelationship(MyRelations.RelType2, Direction.INCOMING)) 
      return lastNode.getRelationships(MyRelations.RelType3, Direction.OUTGOING); 
     else if (lastNode.hasRelationship(MyRelations.RelType3, Direction.INCOMING)) 
      return null; 
     return null; 
    } 
} 

但是我不能够想到的办法,这将告诉我的唯一路径数,随后遍历过程中同时使用遍历API(等效于上面RETURN count(nodes(path)))。我怎样才能做到这一点?遍历API不可能吗?

PS:通过独特的路径,我指的是遍历时访问的节点的顺序的唯一排列。例如,所有a-b-c,a-c-ba-b-c-d都是唯一的。

+0

'节点(路径)'从路径返回节点数组,而不是节点数...... –

回答

0

这查询不返回唯一路径的数量,但所有路径的数量由查询返回:

MATCH path=(a:NodeType1 {prop1:"value1"})-[:RelType1]->(b) 
      -[:RelType2]->(c)-[:RelType3]->(d) 
RETURN count(nodes(path)) 

如果你要计算在查询中惟一的节点数量,你可以这样做:

计算的唯一路径的数量将是(对每个路径计算其独特的指纹,它不会是很难通过遍历API重复)
MATCH path=(a:NodeType1 {prop1:"value1"})-[:RelType1]->(b) 
      -[:RelType2]->(c)-[:RelType3]->(d) 
UNWIND nodes(path) AS N 
RETURN count(distinct N) 

方式一:

MATCH path=(a:NodeType1 {prop1:"value1"})-[:RelType1]->(b) 
      -[:RelType2]->(c)-[:RelType3]->(d) 
WITH path, 
    REDUCE(acc="", x in nodes(path) | acc + id(x)) + 
    REDUCE(acc="", x in rels(path) | acc + id(x)) as uniID  
RETURN count(distinct uniID) 
+0

密码体返回的路径数和唯一路径数是否会有所不同?我觉得两者总是一样。 – Mahesha999

+0

另外它的奇怪之处在于'RETURN节点(路径)'返回路径的数量,尤其是当'返回路径,节点(路径)'正确返回路径时,节点'。然而,对于所有路径,“返回路径,计数(节点(路径))”返回“路径1”,即“1”。所以,我试图通过类似这样的方式获得路径中的节点数:'返回路径,COUNT(UNWIND节点(路径))'。它给出了错误。我知道我们可以这样做:'返回路径,长度(路径)+ 1'为节点数量= 1 +关系数量'长度(路径)'返回关系数量。但是我们可以使用'COUNT(UNWIND nodes(path))'来做到这一点,这样我们可以做COUNT(不同的UNWIND节点(路径))' – Mahesha999