2016-08-20 14 views
0

當使用變量長度標識符進行更深層次的操作時,是否有方法保留或僅返回最終的全部節點序列而不是所有子路徑每個最終全序列路徑上的操作。密碼查詢返回或僅保留使用可變長度關係標識符時的最終序列

MATCH路徑=(S:人) - [RELS:NEXT *] - >(E:人)................

例如:找到所有在給定列表中具有其名稱的節點序列,比如['graph','server','db']具有相同的'seqid'屬性。

(圖形) - >(服務器) - (分貝)與相同SEQID:1

(圖形) - >(分貝) - >(服務器)具有相同SEQID:1 //可以有另一個匹配
序列具有相同SEQID

(圖) - >(DB) - >(服務器)具有相同的SEQID:2

有沒有辦法只保留節點的最終序列說'(圖) - >(服務器) - >(db)'代替每個序列>(服務器)或(服務器) - - 樣(圖)大序列的子路徑>(DB)

請幫助我解決這個.........

(我在嵌入模式下使用neo4j 2.3.6社區版通過java api ..)

+0

您可以共享是Cypher支架查詢匹配所有序列? – InverseFalcon

+0

另外,如果可以通過多個有效路徑到達同一個端點節點,您是否有任何要求?此外,我沒有看到S被視爲一些獨特的開始節點,它在所有:Person節點上匹配。這種查詢是否適用於所有人:人員,還是來自單個(或一組)開始節點? – InverseFalcon

+0

假設您希望您的起始節點沒有傳入:NEXT關係是否公平?如果不是,應該使用什麼樣的標準來確定序列的起始節點? – InverseFalcon

回答

1

我們真的可以在這裏使用的是一個longestSequences()函數,它可以完成您想要的操作,擴展模式,使a和b將始終與序列中的開始點和結束點匹配,以使模式不是任何其他匹配模式的子集。

我創建正是這種對Neo4j的功能要求:https://github.com/neo4j/neo4j/issues/7760

而且直到得到實施,我們將不得不湊合着用一些替代方法。我認爲我們要做的就是添加額外的匹配,將a和b限制爲完整序列的開始和結束節點。

這是我提出的查詢:

WITH ['graph', 'server' ,'db'] as names 
MATCH p=(a)-[rels:NEXT*]->(b) 
WHERE ALL(n in nodes(p) WHERE n.name in names) 
AND ALL(r in rels WHERE rels[0]['seqid'] = r.seqid) 
WITH names, p, a, rels, b 
// check if b is a subsequence node instead of an end node 
OPTIONAL MATCH (b)-[rel:NEXT]->(c) 
WHERE c.name in names 
AND rel.seqid = rels[0]['seqid'] 
// remove any existing matches where b is a subsequence node 
WITH names, p, a, rels, b, c 
WHERE c IS NULL 
WITH names, p, a, rels, b 
// check if a is a subsequence node instead of a start node 
OPTIONAL MATCH (d)-[rel:NEXT]->(a) 
WHERE d.name in names 
AND rel.seqid = rels[0]['seqid'] 
// remove any existing matches where a is a subsequence node 
WITH p, a, b, d 
WHERE d IS NULL 
RETURN p, a as startNode, b as endNode 
+0

非常感謝您的幫助....但是請幫助......它不會捕獲那些以相同seqid ..i.e出現的順序。如果(圖) - >(服務器) - >(數據庫)與seqid 2和(數據庫) - >(圖) - >(服務器)相同的seqid 2是否存在,那麼它不會顯示兩個。如果可能請幫助我。 –

+0

在你的評論中,這兩個序列(圖形 - >服務器 - >數據庫,數據庫 - >圖形 - >服務器)是分開的,還是你說的重疊(其中實際序列是db-> graph-> server-> db和你需要匹配內部兩個不同的序列?另外,你能否澄清你想查找的序列是否應該包含給定名稱列表中的名稱的節點(所以server-> server-> server會好的),或者如果你正在查找給定名稱列表中每個名稱中只有一個名稱的序列,則不會重複? – InverseFalcon

+0

(圖形 - >服務器 - > db,db->圖形 - >服務器)是單獨的.. –

0

將帖子

此查詢可能會做你想要什麼:

MATCH (p1:Person)-[rel:NEXT]->(:Person) 
WHERE NOT (:Person)-[:NEXT {seqid: rel.seqid}]->(p1) 
WITH DISTINCT p1, rel.seqid AS seqid 
MATCH path = (p1)-[:NEXT* {seqid: seqid}]->(p2:Person) 
WHERE NOT (p2)-[:NEXT {seqid: seqid}]->(:Person) 
RETURN path; 

它首先識別所有Person節點(p1)至少一個傳出NEXT的關係,沒有傳入NEXT關係(與seqid相同),和他們明顯的傳出seqid值。然後,它從每個p1節點開始並且具有全部共享相同seqid的關係,找到所有「完整」路徑(即其開始和結束節點分別與期望的seqid沒有呼入或呼出關係的路徑)。最後,它返回每個完整的路徑。

如果你只是想獲得的所有Person節點的name財產的每個路徑,嘗試此查詢(用不同的RETURN條款):

MATCH (p1:Person)-[rel:NEXT]->(:Person) 
WHERE NOT (:Person)-[:NEXT {seqid: rel.seqid}]->(p1) 
WITH DISTINCT p1, rel.seqid AS seqid 
MATCH path = (p1)-[:NEXT* {seqid: seqid}]->(p2:Person) 
WHERE NOT (p2)-[:NEXT {seqid: seqid}]->(:Person) 
RETURN EXTRACT(n IN NODES(path) | n.name); 
+1

這可能會工作,只要開始和結束節點定義爲沒有:根據什麼是NEXT關係在這裏,如果是這種情況,這絕對是最好的解決方案的開始(仍然需要在那裏的名稱限制)。但是,如果可以有:NEXT與起始和結束節點之間的關係,但是具有不同的seqids,或者甚至具有相同的seqid,但從/到具有我們不關心的名稱的節點,我們需要更強大的查詢。 – InverseFalcon

+0

我編輯了我的答案,以考慮我認爲是來自@InverseFalcon的有效評論。 – cybersam

+0

請幫助...我只想要選擇的元素列表的序列... ['圖','服務器','數據庫],可以以任何順序發生相同的seqid或不同 –

0
MATCH (S:Person)-[r:NEXT]->(:Person) 
    // Possible starting node 
    WHERE NOT ((:Person)-[:NEXT {seqid: r.seqid}]->(S)) 
WITH S, 
    // Collect all possible values of `seqid` 
    collect (distinct r.seqid) as seqids 
UNWIND seqids as seqid 
// Possible terminal node 
MATCH (:Person)-[r:NEXT {seqid: seqid}]->(E:Person) 
    WHERE NOT ((E)-[:NEXT {seqid: seqid}]->(:Person)) 
WITH S, 
    seqid, 
    collect(distinct E) as ES 
UNWIND ES as E 
    MATCH path = (S)-[rels:NEXT* {seqid: seqid}]->(E) 
RETURN S, 
     seqid, 
     path 
+0

請求幫助...我只想要選擇的元素列表... ['圖表','服務器','數據庫]的序列,可以以任何順序出現相同的seqid或不同的 –