Я хотел бы найти в Neo4j DB подграф только с сильными двусторонними отношениями.
Скажем, отношение ЛЮБОВЬ, а атрибут - Поцелуи, тогда я хотел бы найти только подграф, в котором обе стороны поцеловали друг друга более 2 раз.
START n=node(*)
MATCH n-[r1:LOVES]->friend<-[r2:LOVES]-n
WHERE r1.Kisses > 2 and r2.Kisses > 2
RETURN n, friend, r1, r2
LIMIT 20
проблема в том, что запрос, кажется, выполняется вечно на графике взаимосвязей узлов 3M и 30M, на 32 ГБ ОЗУ, четырехъядерной системе с максимальной кучей 16 ГБ для neo4j (калькулятор neo4j предложил 8 ГБ).
Подозреваю, где-то скрывается бесконечная петля.
ОС: Ubuntu 12.04.1 LTS-сервер
Софт: neo4j-community-1.8.1
версия java "1.7.0_10" (neo4j start говорит, что нужно использовать JDK6)
Среда выполнения Java (TM) SE (сборка 1.7.0_10-b18)
64-разрядная серверная виртуальная машина Java HotSpot (TM) (сборка 23.6-b04, смешанный режим)
РЕДАКТИРОВАТЬ: совпадение неверно, оно должно быть
MATCH n-[r1:LOVES]->friend-[r2:LOVES]->n
ОБНОВЛЕНИЕ: после исправления семантики выше я все еще не могу получить полный результат за 5 минут.
ЛЮБОВЬ - единственный тип отношений, и около 10-20% отношений имеют соответствующий другой тип отношений.
Моя конечная цель - найти подходящие значения Kiss, чтобы у меня осталось ‹100k узлов (и все соответствующие отношения LOVES) и я мог экспортировать этот подграф.
Вот псевдокод алгоритма того, что я пытаюсь сделать:
let E be edge.list to be processed
let myedgelist be empty list
for e in E:
if e.n1 > e.n2: # so we do not look twice
continue
if not exist(e[n2][n1]): # this is where lookup can be a problem O(1) for hash, O(logn) for sorted, O(n) for something random)
continue
if e.kisses > 2 and e[n2][n1].kisses > 2:
add e to myedgelist
add e[n2][n1] to myedgelist
return myedgelist
Этот алгоритм должен работать не более, чем edgecount * log (edgecount), если только нет эффективного способа найти наличие обратной связи в neo4j, что могло бы показаться довольно немыслимым.
MATCH n-[r1:LOVES2]->friend-[r2:LOVES2]->n
- person ulkas   schedule 04.01.2013