neo4j найти все узлы с подходящими свойствами

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

Есть идеи, как поступить? Не найдено никаких отправных точек в документах neo4j. Я'м на 1.8.2 Community Edition.

РЕДАКТИРОВАТЬ

Извините за непонятность в первоначальном вопросе, но яЯ говорю об этом через Сайфера.

Ответы на вопрос(7)

Вы можете попробовать того, кто делает то, что, я думаю, делает все, что вы хотите.

START n=node(*), m=node(*)
WHERE 
  HAS(n.name) AND HAS (m.name) AND 
  n.name=m.name AND 
  ID(n) 
 Paul01 июн. 2013 г., 21:14
выглядит многообещающе, япопробую, спасибо.

Cypher для подсчета значений в свойстве, возвращая также набор узлов:

start n=node(*)
where has(n.prop)
with n.prop as prop, collect(n) as nodelist, count(*) as count
where count > 1
return prop, nodelist, count;

Пример на консоли:http://console.neo4j.org/r/k2s7aa

Вы также можете выполнить сканирование индекса со свойством, например так (чтобы не смотреть на узлы, которые нет это свойство):

start n=node:node_auto_index('prop:*') ...

2.0 Cypher с этикеткой

match (n:Label)
with n.prop as prop, collect(n) as nodelist, count(*) as count
where count > 1
return prop, nodelist, count;
 Eve Freeman28 окт. 2013 г., 21:45
да, с M06 это требование. Благодарю. Я'обновлю.
 holaSenor24 окт. 2013 г., 19:57
С Neo4j 2.0.0-M06 я получаю синтаксическую ошибку, говорящую мне, что мне нужно () вокруг шаблона соответствия. Нравится: match (n: Label).

Neo4j 3.1.1

HAS больше не поддерживается в Cypher, используйте вместо этого EXISTS.

Если вы хотите найти узлы с определенным свойством, Cyper выглядит следующим образом:

MATCH (n:NodeLabel) where has(n.NodeProperty) return n

Лучший / самый простой вариант - сделать что-то вроде местногоMap, Если бы вы сделали что-то вроде этого, вы могли бы создать такой код:

GlobalGraphOperations ggo = GlobalGraphOperations.at(db);
Map duplicateMap = new HashMap();

for (Node node : ggo.getAllNodes()) {
    Object propertyValue = node.getProperty("property");
    Node existingNode = duplicateMap.get(propertyValue);
    if (existingNode == null) {
        duplicateMap.put(propertyValue, node);
    } else {
        System.out.println("Duplicate Node. First Node: " + existingNode + ", Second Node: " + node);
    }
}

Это распечатало бы список. Если вам нужно сделать больше, например удалить эти узлы, вы можете сделать что-то в другом.

Вы знаете название недвижимости? Это будет несколько свойств или просто дубликаты одной пары имя / значение? Если вы делаете несколько свойств, просто создайте карту для каждого свойства, которое у вас есть.

 Nicholas30 мая 2013 г., 16:31
Проблема в тебеВам придется использовать цикл, если только эти узлы не проиндексированы по имени свойства. Если они проиндексированы, вы можете пройтись по каждому узлу и просмотреть индекс, если для данного свойства возвращено более 1 узла.
 Paul30 мая 2013 г., 06:26
Я знаю название недвижимости, но яя пытаюсь сделать это через шифр, если это возможно, б / с I 'Я не использую Java-клиент, и мое потребительское приложение связывается с сервером с помощью запросов REST API и Cypher.

Как насчет следующего подхода:

использованиеgetAllNodes чтобы получить Iterable по всем узлам.с помощьюgetPropertyKeys а такжеGetProperty (ключ) создатьjava.util.Map содержащий все свойства для узла. Рассчитать картуhashCode()создать глобальныйMap используя хэш-код в качестве ключа и наборnode.getId() как значения

Это должно дать вам кандидатов на дубликат. Помните о семантике hashCode (), могут быть узлы с разными свойствами, отображающими один и тот же hashCode.

 Paul30 мая 2013 г., 06:27
Не использовать Java, как указано выше. Также я'у нас более 20000 узлов; Я надеялся на что-то более эффективное, чем зацикливание.

С Neo4j 3.3.4 вы можете просто сделать следующее:

MATCH (n) where EXISTS(n.propertyName) return n

Просто поменяйpropertyName на любую собственность, которую вы ищете, чтобы найти.

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

 Automatico14 нояб. 2013 г., 15:22
Как бы вы использовали это?

Ваш ответ на вопрос