質問:オプションの関係を使用せずに、1 つの Cypher クエリで 2 つの独立したパターンの出現をカウントするにはどうすればよいですか?
例:ソーシャル ネットワークに参加しているすべての人について、友人の数と作成した投稿の数を数えます。
オプションの関係を使用すると、簡単です...
人の友達を数える:
MATCH (person:PERSON)
WITH person
MATCH (person)-[?:KNOWS]-(friend:PERSON)
RETURN person.firstName AS name, count(friend) AS friends
+----------------------+
| name | friends |
+----------------------+
| "alex" | 3 |
| "aiya" | 1 |
| "jacob" | 1 |
| "peter" | 1 |
| "stranger" | 0 |
+----------------------+
人の投稿を数える:
MATCH (person:PERSON)
WITH person
MATCH (person)<-[?:HAS_CREATOR]-(post:POST)
RETURN person.firstName AS name, count(post) AS posts
+--------------------+
| name | posts |
+--------------------+
| "alex" | 0 |
| "aiya" | 3 |
| "jacob" | 3 |
| "peter" | 1 |
| "stranger" | 2 |
+--------------------+
人の友達と投稿を数える:
MATCH (person:PERSON)
WITH person
MATCH (person)-[?:KNOWS]-(friend:PERSON)
WITH person, count(friend) AS friends
MATCH (person)<-[?:HAS_CREATOR]-(post:POST)
RETURN person.firstName AS name, friends, count(post) AS posts
+------------------------------+
| name | friends | posts |
+------------------------------+
| "peter" | 1 | 1 |
| "aiya" | 1 | 3 |
| "alex" | 3 | 0 |
| "stranger" | 0 | 2 |
| "jacob" | 1 | 3 |
+------------------------------+
ただしMATCH
、オプションのリレーションシップがない場合、クエリの結果は、次の 2 つの句のいずれかでカウント結果がゼロのすべてのノードを除外します。
MATCH (person:PERSON)-[:KNOWS]-(friend:PERSON)
WITH person, count(friend) AS friends
MATCH (person)<-[:HAS_CREATOR]-(post:POST)
RETURN person.firstName AS name, friends, count(post) AS posts
+---------------------------+
| name | friends | posts |
+---------------------------+
| "peter" | 1 | 1 |
| "aiya" | 1 | 3 |
| "jacob" | 1 | 3 |
+---------------------------+
参考までに、望ましい結果は次のとおりです。
+---------------------------+
| name | friends | posts |
+---------------------------+
| "alex" | 3 | 0 |
| "peter" | 1 | 1 |
| "aiya" | 1 | 3 |
| "jacob" | 1 | 3 |
+---------------------------+