2013-03-21 3 views
2

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

int count = 0; 
for (Relationship r : node.getRelationships(RelationshipTypes.MODIFIES, Direction.OUTGOING)) 
{ 
    count++; 
} 
return count; 

Тип возврата getRelationships является Iterable поэтому я не могу использовать размер() или эквивалент. Я пытаюсь избежать необходимости вытаскивать все отношения из базы данных, потому что у некоторых узлов есть много отношений (> 5 миллионов). Есть ли более быстрый способ сделать это?

ответ

3

Нет. Способ, которым neo4j хранит отношения на диске для узла, находится в связанном списке, и они не сохраняют статистику какого-либо типа для узлов или отношений. Чтобы получить счет, вам придется пройти через все отношения для узла этого типа.

Даже если у вас есть кэш, с которым они хранят его более эффективно, система все еще не может обеспечить полную картину. Вы лучший метод.

+0

Я боялся, что это был ответ, но надеялся, что я ошибся. – jlewis42

+0

То же самое здесь, мне это не нравится, однако я прошел через Структуру Neo4j хранит объекты, и на диске нет статистики, и ВСЕ отношения узла находятся в связанном списке на диске. – Nicholas

0

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

+0

Этот метод быстро растет, так как количество отношений, которые вы хотите проверить, также увеличивается. –

+0

Как он быстро растет? Является ли это из-за изменения размера структуры данных или имеет ли размер структуры большую стоимость? –

+0

Я имею в виду, вам понадобится структура данных для каждого требования. –

0

если node.getRelationships(RelationshipTypes.MODIFIES, Direction.OUTGOING) возвращается тип Collection затем знать количество исходящих отношений определенного типа узла есть, вы можете просто использовать следующее:

int count = node.getRelationships(RelationshipTypes.MODIFIES, Direction.OUTGOING).size(); 
+1

Это не сработает, потому что getRelationships возвращает Iterable, а не коллекцию. – jlewis42

0

Я вижу, что вы используете Neo4j апи. Другой способ - пойти с ThinkerPop языком запросов gremlin, который доступен как для groovy, так и для scala, но они будут делать то же самое внутри. Как я знаю, neo4j дает вам доступ через итератор из-за причин производительности. Например, у вас могло бы быть миллионное отношение, но вы хотите разбивать результаты на лету. Было бы очень медленно, если Neo4J всегда вернет коллекцию отношений. Вот почему он возвращает итератор и дает вам доступ на лету к отношениям. Они не извлекаются из БД, пока они вам не понадобятся.

Так что я бы сказал НЕТ. Надеюсь, я смогу вам помочь.