2016-12-01 6 views
2

CompanyとWorkerの2種類のノードを持つ簡単な例を考えてみましょう。どの会社のc1とc2(私がここで無視するいくつかの条件を尊重します)については、私は知っておく必要があります:1.共通の労働者の数、c1の労働者の数、c2の労働者の数。Neo4j同じエッジの数倍を使用するCypherパス

私の最初の推測されました:

MATCH (w_c1:Worker)--(c1:Company)--(w_common)--(c2:Company)--(w_c2:Worker) 
WHERE <something> 
RETURN c1, c2, COUNT(DISTINCT w_common), COUNT(DISTINCT w_c1), COUNT(DISTINCT w_c1) 
その要求に伴う問題は、私が接続されたノード、COUNT(DISTINCT w_c1)(w_c2のid)の任意のペアの間に一つだけのリンクを持っている場合にのみカウントしない、ということである

c2と共通ではないc1の作業者。しかし、いくつかのノード間にいくつかの関係がある場合、その結果は「正しい」ことがあります。 (w_common) - (c2:Company) - (w_c2:Worker)は一致しません( "worker1") - ( "company2") - ( "worker1")(無限ループを回避する意味があります)。

私の第二の推測では、二つの部分に要求を分割することでした: 私の最初の推測があった。

MATCH (c1:Company)--(w_common)--(c2:Company) 
MATCH (c1)--(w_c1:Worker), (c2)--(w_c2:Worker) 
WHERE <something> 
RETURN c1, c2, COUNT(DISTINCT w_common), COUNT(DISTINCT w_c1), COUNT(DISTINCT w_c1) 

しかし、その後、結果が正しいですが、私は大きな上で、確かにデカルトの製品に関する警告を持っており、私のリクエストは数時間後に完了しません。私は2つのマッチの間に "WITH c1、w_common、c2"を試みましたが、まだ警告があります

どうすればいいですか?

答えて

1

パターンの出現回数を示すことができるSIZE()関数は、Workers per:Companyのようなものです。

このクエリは、会社のために働く労働者のみがその会社に1体の関係を持っていると仮定して、あなたのために働く可能性があります

MATCH (c1:Company)--(w_common:Worker)--(c2:Company) 
WHERE <your criteria for matching on a specific c1 and c2> 
RETURN COUNT(w_common) as inCommonCount, SIZE((c1)--(:Worker)) as c1Count, SIZE((c2)--(:Worker)) as c2Count 
+0

おかげで、私は実際にSIZE関数を試しましたが、私は特定の会社と労働者の間にいくつかの関係があるかもしれません。 – Vandy

+1

':HIRED'のような特有のものがありますか?それで 'size((c1) - [:HIRED] - >())'のようなことができます。 –

1

あなたは小計を使用することができます。

OPTIONAL MATCH (C1:Company {name: 'c1'}) 
OPTIONAL MATCH (C2:Company {name: 'c2'}) 
WITH C1, C2 
MATCH (C:Company)<-[:workto]-(W:Worker) WHERE C = C1 OR C = C2 
WITH C1, C2, W, 
    sum(CASE WHEN C = C1 THEN 1 ELSE 0 END) as tmp1, 
    sum(CASE WHEN C = C2 THEN 1 ELSE 0 END) as tmp2 
RETURN C1, C2, 
     sum(tmp1) as cc1, sum(tmp2) as cc2, 
     sum(tmp1 * tmp2) as common 
関連する問題