以下基本圖:獲得的唯一路徑數量穿越而穿越利用我創建的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)
圖表看起來是這樣的:
當我運行以下暗號:
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
我得到的返回結果兩行:
現在我猜測如何在使用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-b
和a-b-c-d
都是唯一的。
'節點(路徑)'從路徑返回節點數組,而不是節點數...... –