与えられたモデルNeo4jのcypherクエリ(UNIONの代わり)を組み合わせる最も良い方法は?
モデル間にはカテゴリと関係があります。 リレーションの場合、特定の開始カテゴリまたは終了カテゴリにバインドされている場合は、リレーションを指定できます。
- のみ開始カテゴリが指定されている(例:「送信」)
- のみエンドカテゴリが指定されている(例:「受信」) :
- 両方、開始および終了カテゴリが指定されている(例:「発信と着信」)
- どちらない開始も終了カテゴリが指定されている(例:「未結合」)
ザ・は関係の4種類があります
コード:あなたが関係し、得られエンドノードを作成することができ、開始ノードとして「猫」を選択し、お知りになりたい場合は
MERGE (cat:ModelCategory {title:'Cat'})
MERGE (rel1:ModelRelation {title:'Outgoing'})
MERGE (rel2:ModelRelation {title:'Incoming'})
MERGE (rel3:ModelRelation {title:'Outgoing and Incoming'})
MERGE (rel4:ModelRelation {title:'Unbound'})
MERGE (rel1)-[:STARTS_AT]->(cat)
MERGE (rel2)-[:ENDS_AT]->(cat)
MERGE (rel3)-[:STARTS_AT]->(cat)
MERGE (rel3)-[:ENDS_AT]->(cat)
シングルはあなたができる、
を問い合わせます単一のクエリを使用します。
// Relations with current source and a target
// Returns relation "Outgoing and Incoming"
MATCH (relation:ModelRelation)-[STARTS_AT]->(:ModelCategory{title:"Cat"}),
(relation)-[ENDS_AT]->(target)
RETURN DISTINCT relation, target
// Relations with current source and without target
// Returns relation "Outgoing"
MATCH (relation:ModelRelation)-[STARTS_AT]->(:ModelCategory{title:"Cat"})
WHERE NOT (relation)-[:ENDS_AT]->()
MATCH (allCategories:ModelCategory)
RETURN relation, allCategories as target
// Relations with target, without source
// Returns relation "Incoming"
MATCH (relation:ModelRelation)-[ENDS_AT]->(target)
WHERE NOT (relation)-[:STARTS_AT]->()
RETURN relation, target
// Relations without source or target
// Returns relation "Unbound"
MATCH (relation:ModelRelation)
WHERE NOT (relation)-[:STARTS_AT]->() AND NOT (relation)-[:ENDS_AT]->()
MATCH (allCategories:ModelCategory)
RETURN relation, allCategories as target
質問を
4つのクエリを組み合わせる最も良い方法は何ですか?
最も簡単な解決策は、ステートメントの間にUNIONを追加することです。
ラベルModelRelationとModelCategoryのすべてのノードを最初に取得し、サブグラフでさらにクエリを実行することをお勧めしますか?
更新が
より良い解決策は、指定されたターゲットの有無にかかわらず関係の間disginguishすることです。 (1つのカテゴリまたはすべてのカテゴリで発生します).1つのUNIONはまだ必要であり、両方のサブクエリの最初の部分は同じです。
// Relations which start at selected category or have no specified start
MATCH (relation:ModelRelation)
WHERE (relation)-[:STARTS_AT]->(:ModelCategory{title:"Cat"}) OR
NOT (relation)-[:STARTS_AT]->()
// Relations with specified targets
Match (relation)-[ENDS_AT]->(target)
RETURN relation, target
UNION
// Relations which start at selected category or have no specified start
MATCH (relation:ModelRelation)
WHERE (relation)-[:STARTS_AT]->(:ModelCategory{title:"Cat"}) OR
NOT (relation)-[:STARTS_AT]->()
// Relations without specified targets
MATCH (relation)
WHERE NOT (relation)-[:ENDS_AT]->()
MATCH (allCategories:ModelCategory)
RETURN relation, allCategories as target