2016-09-27 27 views
4

我有一個圖形數據庫,用於映射建築物和公交車站之間的連接,其中圖形包含其他連接件,如道路和交叉點(在許多節點類型中)。如何在neo4j密碼中通過節點標籤過濾結果?

我想弄清楚的是如何過濾一個路徑,只返回特定的節點類型。我有兩個相關的問題,我目前正在努力。

問題1:如何返回沿路徑的節點標籤?

看起來合乎邏輯的第一步是確定哪些節點沿路徑發生了類型的節點

我曾嘗試以下:

MATCH p=(a:Building)­-[:CONNECTED_TO*..5]­-(b:Bus) 
WITH nodes(p) AS nodes 
RETURN DISTINCT labels(nodes); 

不過,我收到標籤()期望和類型節點的數據收集不是一個類型的異常錯誤。我想動態地知道我的路徑上有哪些類型的節點,以便最終可以過濾我的路徑。

問題2:如何返回匹配我在第一步中標識的標籤的路徑中的一部分節點?

說我發現,和(d1:Bus)(d2:Bus)之間(a:Building),我可以期望找到(:Intersection)節點和(:Street)節點。

這是我圖形的簡化模型:

(a:Building)­­--(:Street)­--­(:Street)--­­(b1:Bus) 
      \­­(:Street)--­­(:Intersection)­­--(:Street)--­­(b2:Bus) 

我寫了一個MATCH聲明會尋找(:Building)(:Bus)節點之間所有可能的路徑。接下來我需要做些什麼來過濾選擇性地返回街道節點?

MATCH p=(a:Building)-[r:CONNECTED_TO*]-(b:Bus) 
    // Insert logic to only return (:Street) nodes from p 

任何有關這方面的指導將不勝感激!

回答

3
  1. 要獲得不同的標籤沿着匹配路徑:

    MATCH p=(a:Building)-[:CONNECTED_TO*..5]-(b:Bus) 
    WITH NODES(p) AS nodes 
    UNWIND nodes AS n 
    WITH LABELS(n) AS ls 
    UNWIND ls AS label 
    RETURN DISTINCT label; 
    
  2. 要返回有Street標籤的節點。

    MATCH p=(a:Building)-[r:CONNECTED_TO*]-(b:Bus) 
    WITH NODES(p) AS nodes 
    UNWIND nodes AS n 
    WITH n 
    WHERE 'Street' IN LABELS(n) 
    RETURN n; 
    
+0

如果在'NODES(p)WHERE(node:Street))中使用'WITH p,FILTER(節點)作爲街道',您可能會在2中獲得更高效的查詢。這也可以讓你保留單獨的匹配路徑,因爲你當前的查詢只返回街道,但是你失去了路徑信息,或者即使有多條路徑可用。 – InverseFalcon

0

Cyber​​sam的回答都不錯,但它們的輸出僅僅是標籤的列...你完全失去路徑信息。因此,如果從一個:Building到一個Bus的多條路徑,第一個查詢將只輸出所有節點中所有模式的所有標籤,並且您不能確定存在多少路徑,並且由於您丟失了路徑信息,因此無法告訴某些路徑中的標籤是什麼,但不是其他路徑中的標籤,還是某些路徑之間的標籤。

同樣,第二個查詢會丟失路徑信息,因此如果有多條路徑使用不同的街道從a:Building到a Bus中獲取,則cybersam的查詢將返回所有路徑中涉及的所有街道。它可能會輸出圖形中的所有街道,這似乎不是很有用。

您需要保存路徑信息的查詢。

爲1,找到每一條路徑上的節點不同的標籤我會提供此查詢:

MATCH p=(:Building)-[:CONNECTED_TO*..5]-(:Bus) 
WITH NODES(p) AS nodes 
WITH REDUCE(myLabels = [], node in nodes | myLabels + labels(node)) as myLabels 
RETURN DISTINCT myLabels 

爲2,此查詢保存路徑信息:

MATCH p=(:Building)-[:CONNECTED_TO*..5]-(:Bus) 
WITH NODES(p) AS nodes 
WITH FILTER(node in nodes WHERE (node:Street)) as pathStreets 
RETURN pathStreets 

注意,這些都是昂貴的操作,因爲它們執行所有建築物和所有公共汽車的笛卡爾產品,就像您在描述中的查詢一樣。我強烈建議縮小與之相匹配的建築物和公共汽車,希望至少能減少很少或特定的建築物。

我也鼓勵限制你在你的模式中看多深。我知道圖中很多(如果不是大多數)節點通過CONNECTED_TO關係進行連接,如果我們沒有將其限制在合理範圍內,則查詢可能會查找整個圖中的每條路徑,不管多久或複雜或無意義,我不認爲這就是你想要的。