2017-06-08 4 views
0

これはおそらく簡単な答えのための長い質問だと思います。しかし、私はクエリ論理に何か問題がある場合に備えて完全な文脈を含めることを賢明と考えました(オフの場合はフォーマットを許してください - 私はヴァルスの名前を変更しました。クエリ/ダブルオプショナルマッチ問題

組織は、従業員や元従業員 EX1

することができ、サブオフィス

(o:Organisation)-[:sub_office]->(an:Organisation) 

それとも本社異なるサブオフィスの

(o)-[:head_office]->(ho:Organisation) 

者を持つことができます

(o)-[:employee]->(p:Person{name:'person1'})<-[:ex_employee]-(an) 

人物は、管理関係によって他の人と関連付けることができます。これらの管理リンクは可変長にすることができます。 EX2

(o)-[:employee]->(p:Person{name:'person2'})-[:managed]->(p:Person{name:'person3'})<-[:ex_employee]-(an) 
(o)-[:ex_employee]->(p:Person{name:'person4'})-[:managed]->(p:Person{name:'NOT_RETURNED1'})-[:managed]->(p:Person{name:'person5'})<-[:employee]-(an) 
(o)-[:ex_employee]->(p:Person{name:'person6'})<-[:managed]-(p:Person{name:'NOT_RETURNED2'})<-[:managed]-(p:Person{name:'person8'})<-[:employee]-(an) 
(o)-[:ex_employee]->(p:Person{name:'person9'})-[:managed]->(p:Person{name:'NOT_RETURNED4'})-[:managed]->(p:Person{name:'NOT_RETURNED5'})<-[:managed]-(p:Person{name:'person11'})<-[:employee]-(an) 
.... 

私が照会しています:彼らはこれらがすべて正常に動作している 関連している - どのように、 -organisationを -subオフィス、 (私は...と思う)

問題I (EX1のように)他の組織に直接接続されている場合やマネージド・チェーン(EX2-Iのすべてのもの)に接続されている場合のみ、組織に関係する人物(従業員または元従業員)クエリーによって返されないPersonを名前 'NOT_RETURNED'としてマークすることで、より明確にしようとしました)

私が作成した以下:

MATCH (queryOrganisation:Organisation{name:'BigCorp'})-[orgRel]-(relatedOrganisation:Organisation) 
    WITH queryOrganisation, orgRel, relatedOrganisation 
    MATCH (queryOrganisation)-[employmentRel]->(queryPerson:Person) 
    OPTIONAL MATCH (queryPerson)<-[relatedOrgRel]-(relatedOrganisation) 
    OPTIONAL MATCH (queryPerson)-[:managed*1..]-(relatedPerson:Person)<-[relatedOrgRel]-(relatedOrganisation) 
    WITH queryOrganisation, orgRel, relatedOrganisation, employmentRel, queryPerson, relatedOrgRel, relatedPerson 
    WHERE NOT queryOrganisation.name = relatedOrganisation.name 
    RETURN ID(queryOrganisation) as queryOrganisationID, 
      ID(startNode(orgRel))as startNodeId, type(orgRel)as orgRel, ID(endNode(orgRel))as endNodeId, 
      ID(relatedOrganisation)as relatedOrganisationId, relatedOrganisation.name as relatedOrganisationName 
      COLLECT({ 
      queryPerson:{endpoint:{ID:ID(queryPerson)}, endpointrelationship: type(employmentRel)}, 
      relatedPerson:{endpoint:{ID:coalesce(ID(relatedPerson),ID(queryPerson))}, endpointrelationship:type(relatedOrgRel)} 
      }) as rels 
私が見えるように収集されたすべての結果を期待しているだろう

:直接接続されたノードの結果(同じノードIDが)のように見えるしかし

{ 
     "startEmp":{ 
     "ID":2715, 
     "startrelationship":"employee" 
     }, 
     "relatedEmp":{ 
     "ID":2722, 
     "endrelationship":"ex employee" 
     } 
    } 

{ 
     "startEmp":{ 
      "ID":2716, 
     "startrelationship":"employee" 
     }, 
     "relatedEmp":{ 
     "ID":2716, 
     "endrelationship":null 
     } 
    } 

タイプ(relatedOrgRel)にnullが表示されるのはなぜですか? OPTIONAL MATCHで何が起こっているのか誤解していますか?relatedOrgRelは、2番目のオプションマッチでnullで上書きされますか?もしそうなら、私はどのように治療することができますか?

ありがとうございました

+0

あなたのCypherには多くのエラーがあります。実際のCypher、または少なくとも法的なものを表示できますか? – cybersam

+0

これは私の実際のグラフではなく、単純なバージョンです(信じられれば)。質問の質問を更新しましたが、実行できません。私はコンセプトを理解する助けを探しています/私の間違いは、二重オプションマッチを使用して、この例のサイファーを稼働させようとしていないときに探しています – Airomega

答えて

1

いいえ、オプションマッチは既に定義されている変数を上書きできません。

私はあなたの2番目のオプションMATCHは何も一致しないときに問題の原因があると思いますが、これは部分的にあなたの帰りに人物の収集に使用されるCOALESCEによって隠蔽さはconsequeの一部を非表示にします。

... 
relatedPerson:{endpoint:{ID:coalesce(ID(relatedPerson),ID(queryPerson))}, endpointrelationship:type(relatedOrgRel)} 
... 

2番目のオプションMATCHが失敗した場合、それはなりますようrelatedPersonは、nullの場合は、バックqueryPersonのIDへの落下しているが、あなたはrelatedOrgRelためCOALESCEを使用していないことから、これはまだnullになります。ここではCOALESCEが必要です。そうでない場合は、失敗した場合にOPTIONAL MATCHESのヌル変数を処理するより良い方法を見つけ出す必要があります。

+0

私はあなたがいると思います。私は第2のオプションの試合が戻ってきたという悪い仮定をしましたが、それは仕事の合体でした。ありがとう – Airomega