2016-04-09 6 views
1

У меня есть Neo4j дб с узлами, какНеобычный ответ от Neo4j запроса

(a : Project)-[:TAGGED]-(t : TAG) 
(a : Project)<-[:HAVE_DONATED{amount, timestamp}]-(u : User) 

У меня есть 3 проекта в моей дб сказать a1, a2, a3, где a1, a2, a3 имеют 2, 3, 8 меток соответственно. 2, 0, 1 пользователи пожертвовали для проектов a1, a2, a3 соответственно. Теперь, если я хочу получить общее количество пожертвований и доноров для каждого проекта, результат будет зависеть от тегов. Я не знаю почему.

Match (a : Project) 
Optional Match (a)-[r:HAVE_DONATED]-(u : User) 
return {id : a.id, donor : count(u), donation : sum(toInt(r.amount))} as project 
  1. ID: a1, донор: 2, пожертвования: 24667
  2. ID: a2, донор: 0, дарение: 0
  3. ID: a3, донор: 1, пожертвования: 112000

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

Match (a : Project) 
Optional Match (a)-[:TAGGED]-(t :TAG) 
, (a)-[r:HAVE_DONATED]-(u : User) 
return {id : a.id, donor : count(u), donation : sum(toInt(r.amount))} as project 
  1. ID: a1, донор: 4, пожертвования: 49334
  2. ID: a2, донор: 0, дарение: 0
  3. ID: a3, донор: 8, пожертвования: 896000

    Если я включаю теги, то донор и пожертвования умножаются на количество тегов. Пожалуйста, помогите мне, где мой запрос пойдет не так.

+0

У вас есть некоторые данные репрезентативной выборки вы можете предоставить? –

+0

@ dave-bennett Нет, у меня нет выборочных данных. – user3542450

+0

@ dave-bennett Я написал запросы на collabedit, пожалуйста, просмотрите его. Из-за некоторой технической проблемы я не могу поделиться консольной консолью neo4j. Вот ссылка collabedit. (Http://collabedit.com/aywme). Вы просто копируете и вставляете запросы в свой db и создаете все необходимые узлы. – user3542450

ответ

1

Вы производите декартовую продукцию путем поиска тегов и пожертвований в одно и то же время. если вы запустите этот запрос, я думаю, вы увидите, что происходит.

Match (a : Project) 
Optional Match (a)-[:TAGGED]-(t :TAG), (a)-[r:HAVE_DONATED]-(u : User) 
return a.id, u, r.amount 

Для каждого проекта, для каждого возвращаемого тега, ваше пожертвование повторяется.

Я думаю, что вы можете быть после того, как что-то вроде этого ...

match (a : Project) 
with a 
optional Match (a)-[r:HAVE_DONATED]-(u : User) 
with a, count(u) as donors, sum(r.amount) as donations 
optional Match (a)-[:TAGGED]-(t :TAG) 
with a, donors, donations, count(t) as tags 
return {id : a.id, donor : donors, donation : donations, tag: tags} as project 
+0

Большое спасибо человеку .. – user3542450