2016-10-14 29 views
0

我如何告訴密碼人不遵循某種關係/邊緣?遵循所有關係,但具體的關係

E.g.我有一個:NODE,它通過:BUDDY關係連接到另一個:NODE。此外,每個:NODE都與任意深度的:STUFF有關,其邊界爲,而不是,其類型爲:BUDDY。我現在想要添加從:NODE:STUFF的快捷關係。但是,我不包括其:BUDDIES:STUFF

(:NODE)-[:BUDDY]->(:NODE) 

(:NODE)-[*]->(:STUFF) 

我當前的查詢看起來是這樣的:

MATCH (n:Node)-[*]->(s:STUFF) WHERE NOT (n)-[:BUDDY]->()-[*]->(s) CREATE (n)-[:HAS]->(s) 

但是我有這個查詢的一些問題:

1)如果我添加不直接:NODE但孩子們之間的:BUDDY關係:NODE查詢將使用該關係進行匹配。這可能不是有意的,因爲我根本不想包括好友。

2)解釋告訴我,neo4j做匹配(:NODE)-[*]->(:STUFF),然後AntiSemiApply模式(n)-[:BUDDY]->()。因此它匹配整個圖表,然後匹配大多數找到的連接。這似乎是無效的,查詢運行速度比我喜歡(但主觀這聽起來可能)。

一個(壞)修正是通過(:NODE)-[*..XX]->(:STUFF)來限制(:NODE)-[*]->(:STUFF)的深度。不過,除非我在最壞的情況下使用了一個荒謬的高數字,否則我無法保證這個深度。

我實際上只是想告訴neo4j只是不遵循某種關係。例如。 MATCH (n:NODE)-[ALLBUT(:BUDDY)*]->(s:STUFF) CREATE (n)-[:HAS]->(s)。我怎樣才能實現這一點,而不必枚舉所有允許的連接,並將它們連接到|(這真的很快 - 但我必須手動跟蹤所有可能的關係)?

回答

0

我的最終溶液從該組

{relations}\{relations_id_do_not_want}

產生一個字符串,並利用它來進行匹配。由於我使用的是API,因此可以自動執行這一代操作,所以不像我擔心的那樣帶來不便,但仍帶來不便。不過,這是自發布此問題以來我能找到的唯一解決方案。

-2

你可以使用一個條件Ønrelationship類型:

MATCH (:Node)-[r:REL]->(:OtherNode) 
WHERE NOT type(r) = 'your_unwanted_rel_type' 

我不知道PERF的線索,雖然這個特定的模式

0

一種選擇是明確的橫移過去在BUDDY關係是一個點關注,然後從那裏做所有無限遍歷。然後你只需要過濾器適用於單步的關係:

MATCH (n:Node) -[r]-> (leaf) 
WHERE NOT type(r) = 'BUDDY' 
WITH n, leaf 
MATCH (leaf) -[*] -> (s:Stuff) 
WITH n, COLLECT(DISTINCT leaf) AS leaves, COLLECT(DISTINCT s) AS stuff 
RETURN n, [leaf IN leaves WHERE leaf:Stuff] + stuff AS stuffs 

另一種選擇是安裝apoc看一看在路徑擴展程序,它允許你「黑名單」節點標籤(如:節點)從你的路徑查詢,這可能會工作,以及取決於你的圖形。 See here.

+0

如果我不在圖中更深的地方添加':BUDDY'關係,解決方案就很好。我會看看apoc。 – Sim