2015-01-10 1 views
1

Я новичок в Neo4j - 2.1.6. В моем графике любой узел может иметь несколько родителей и несколько дочерних элементов, которые также являются родителями и дочерними узлами других узлов. Мне нужно найти тех родителей и детей, которые имеют несколько найденных узлов. Выбранные узлы могут быть от одного до сотен отношений от их общего родителя или дочернего элемента. Все узлы имеют одну и ту же метку.Neo4j Cypher запрос медленно найти общих детей. Каков наилучший подход?

Я использую следующий запрос cypher, но он очень медленный, когда вы добавляете больше, чем пару узлов .... Я хотел бы искать по 20 или более узлов одновременно для их общих соединений. Здесь я ищу детей на 4 узлах:

MATCH (n1)-[*]->(x), (n2)-[*]->(x), (n3)-[*]->(x), (n4)-[*]->(x) 
WHERE n1.name = "node1" AND n2.name ="node2" AND n3.name ="node3" AND n4.name ="node4" 
RETURN DISTINCT x.name 

Есть ли какой-то другой способ, которым я должен подходить к этому? Спасибо!

ответ

1

Добавьте метки и убедитесь, что у вас есть индекс по: Ярлык (имя)

например если вы ярлыки :Node

create index on :Node(name); 

MATCH (n1:Node)-[*]->(x),(n2:Node)-[*]->(x),(n3:Node)-[*]->(x),(n4:Node)-[*]->(x) 
USING INDEX n1:Node(name) 
USING INDEX n2:Node(name) 
USING INDEX n3:Node(name) 
USING INDEX n4:Node(name) 
WHERE n1.name = "node1" AND n2.name ="node2" AND n3.name ="node3" AND n4.name ="node4" 
RETURN DISTINCT x.name 

Для очень длинных путей Cypher могут иметь некоторые проблемы.

Если это частая операция на вашем графике, которая должна завершиться в миллисекундах, я рекомендую создать расширение сервера для сервера Neo4j, написанного на Java.

+0

Это большое спасибо! Сейчас требуется небольшая часть времени. Являются ли длинные пути просто слабостью Cypher или они проблематичны с Neo4j в целом? – Damon

+0

Только слабость планировщика, основанного на правилах, в 2.1. Это изменится в 2.2 (вы также можете попробовать префикс вашего запроса cypher 2.1.experimental и посмотреть, что произойдет) –

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