2016-10-14 5 views
0

特定の関係/エッジに従わないようにするにはどうすればよいですか?特定の関係以外のすべての関係に従います

など。私は:NODEを持っており、それは:BUDDY関係を介して別の:NODEに接続されています。さらに、:NODEは、:BUDDYでないの任意のエッジによって任意の深さの:STUFFに関係している。各:NODEのショートカットリレーションを:STUFFに追加します。ただし、:BUDDIES:STUFFは含まれていません。

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

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

私の現在のクエリは次のようになります。私が今まで:NODE間が、の子ではない直接:BUDDY関係を追加した場合

1):私はこのクエリを持ついくつかの問題を持っているしかし

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

:NODE照会は照合のためにその関係を使用します。私は仲間をまったく入れたくないので、これは意図していないかもしれません。

2)neo4jが(:NODE)-[*]->(:STUFF)と一致し、次にAntiSemiApplyというパターンが(n)-[:BUDDY]->()であることを説明します。その結果、グラフ全体が一致し、見つかった接続のほとんどが一致しなくなります。これは効果がないと思われ、クエリは私の好きなものよりも遅く実行されます(しかし、主観的にはこれは聞こえるかもしれません)。

(:NODE)-[*]->(:STUFF)の深さを制限するのは1つ(悪い)修正です。しかし、私が最悪のシナリオに対してばかげた高い数値を使用しない限り、その深さを保証することはできません。

私は実際にneo4jに特定の関係に従わないように伝えたいと思います。例えば。 MATCH (n:NODE)-[ALLBUT(:BUDDY)*]->(s:STUFF) CREATE (n)-[:HAS]->(s)。どのように私は許可されたすべての接続を列挙し、それらを|(本当に速いですが - すべての可能な関係を手動で追跡する必要があります)と接続せずにこれを達成することができますか?

答えて

0

マイ最終溶液は

{relations}\{relations_id_do_not_want}

のセットからの文字列を生成し、マッチングのためにそれを使用することです。私はAPIを使用しているので、この世代を自動的に行うことができるので、恐れても不便ではありませんが、それでも不便です。しかし、これは私がこの質問を投稿してから唯一の解決策でした。

-2

あなたはnrelationshipのO型条件を使用することができます。この特定のスキーマの

0

一つのオプションが明示的にBUDDY関係がある点を越え横断するものの

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

は私がPERFについての手掛かりを持っていませんあなたがそこから好きな無限に旅をしてください。次に、あなただけの単一ステップの関係にフィルタを適用する必要があります。

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をインストールし、「ブラックリスト」ノードラベル(のようなことを可能にするパスエキスパンダー手順、見てみることです:Node)をパスのクエリから削除します。これはグラフによってはうまくいくかもしれません。 See here.

+0

私はグラフの中でより深い ':BUDDY'関係を追加しないと解決策はあります。私はapocを見ます。 – Sim

関連する問題