簡體   English   中英

Neo4j Cypher:如何從路徑中解壓縮節點以允許進一步匹配?

[英]Neo4j Cypher: How do you unpack nodes from a path to allow for further matching?

這個問題是這里的問題的后續問題

我有一個具有循環鏈表的圖表。 請參閱此處的示例 )鏈接列表中的每個節點都指向一個用戶。 查詢列表時,我必須使用路徑語句,因為列表是循環的,我不想從u:USER節點開始檢索節點。 為了獲得感興趣的節點,我的查詢如下所示:

MATCH path=(nl:NODELINK { linkId:'cc' })-[:LINK*]->(u:USER)
RETURN nodes(path)

一旦我檢索了路徑,我想進一步匹配該路徑中的節點(NODELINK的),如下所示:

MATCH path=(nl:NODELINK { linkId:'cc' })-[:LINK*]->(u:USER)
WITH nodes(path) AS nodeLinks
MATCH nodeLinks-[:PERSONLINK]->persons
RETURN persons

但如果我嘗試我會收到錯誤:

Error: Type mismatch: nodeLinks already defined with conflicting type Collection<Node> (expected Node) (line 3, column 7)
"MATCH nodeLinks-[:PERSONLINK]->persons"

如何從路徑中解壓縮NODELINK類型的節點,以便對它們進行進一步的MATCH查詢?

嘗試這個...有點hacky但是直到有一個展開操作,它才會起作用。

MATCH path=(nl:NODELINK { linkId:'cc' })-[:LINK*]->(u:USER)
WITH [x in nodes(path) | id(x)] AS nodeLinkIds
MATCH (n1:NODELINK)
WHERE id(n1) in nodeLinkIds // this does efficient id lookups for the nodes in the list
MATCH n1-[:PERSONLINK]->persons
RETURN persons

現在有一個UNWIND運算符,所以這應該工作:

MATCH path=(nl:NODELINK { linkId:'cc' })-[:LINK*]->(u:USER)
WITH nodes(path) AS x UNWIND x AS nodeLinks
MATCH nodeLinks-[:PERSONLINK]->persons
RETURN persons

WITH UNWIND nodes(path) AS nodeLinks以為我們可以用WITH UNWIND nodes(path) AS nodeLinks ,但這讓我在Neo4j 2.2.0-M03中出現了一個神秘的Conversion = '''錯誤。

另一種選擇是將所需節點作為行而不是集合返回,然后再與節點行進行匹配。 要將節點作為行返回,首先指定路徑上的節點,然后計算距節點的距離:NODELINK到節點User,如果距離長於從起始節點(例如'cc')到結束的距離用戶節點,然后應從結果中排除。

MATCH path=(:NODELINK { linkId:'cc' })-[:LINK*]->(:USER)
WITH length(path) AS longest
MATCH p=(:NODELINK { linkId:'cc' })-[:LINK*]->(nodeLinks:NODELINK), p1 =(nodeLinks)-[:LINK*]->(:USER)
WITH nodeLinks, length(p1) AS n2u, longest
WHERE n2u <= longest
WITH nodeLinks
MATCH nodeLinks-[:PERSONLINK]->persons
RETURN persons

請參閱控制台的結果, http://neo4j-console-20.herokuapp.com/?id = 87v0fy

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM