2013-09-14 2 views
1

Вопрос: как я считаю появление двух независимых моделей в одном Cypher запроса без использования дополнительных связей?Neo4j Cypher - подсчет вхождений двух независимых моделей в 1 запросе

Пример: для каждого человека в социальной сети подсчитывают, сколько у них друзей и сколько сообщений они сделали.

С дополнительными отношениями легко ...

друзья:

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  | 
+--------------------+ 

друзей COUNT лиц и сообщений:

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 положений:

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  | 
+---------------------------+ 

FYI, желаемый результат:

+---------------------------+ 
| name | friends | posts | 
+---------------------------+ 
| "alex" | 3  | 0  | 
| "peter" | 1  | 1  | 
| "aiya" | 1  | 3  | 
| "jacob" | 1  | 3  | 
+---------------------------+ 

ответ

0

Это является в точности прецедентом для дополнительных отношений. Без дополнительного ?:KNOWS в соответствии с этим вы говорите cypher: «Я хочу соответствовать только тем людям, у которых есть отношение: KNOWS к другому человеку. Верните их вместе с количеством отношений». И это, основываясь на MATCH, которую вы просили, правильно исключает тех, кто не имеет отношения: KNOWS.

При добавлении ссылки необязательно через ?:KNOWS, вы спрашиваете cypher: «Пожалуйста, приведите меня ко всем людям и сопоставьте их с другими людьми, используя отношения KNOWS: KNOWS, если они есть. Верните всех людей и посчитайте своих друзей. "

Можете ли вы объяснить, почему вы не можете использовать необязательное отношение, чтобы выполнить сопоставление в этом случае, поскольку оно кажется мне точным инструментом для этой работы?

+0

Привет @Edward, это было скорее упражнение в любопытстве, чем что-либо еще. Пример, который я дал, является самым тривиальным, о котором я мог думать, но существуют более сложные случаи, когда независимые шаблоны более длинные, а дополнительные отношения сложнее применять. –

Смежные вопросы