Neo4j - получить все связанные узлы типа и создать новую связь

У меня есть набор данных, который выглядит так (артефакт)-[HAS]-(ключевое слово), ключевые слова могут использоваться артефактами несколько раз. Чего я пытаюсь достичь, так это;

Возврат наиболее взаимосвязанных узлов ключевых слов, количество артефактов, связанных с ключевыми словами, количество перекрытий между узлами ключевых слов и переходов к другому ключевому слову (ключевое слово) — (артефакт) — (ключевые слова), количество «общих» артефактов между двумя ключевыми словами.

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

1) ложка (ключевые слова; металл, еда)

2) меч (ключевые слова; металл, бой)

3) вилка (ключевые слова; металл, еда)

Таким образом, запрос вернет узел ключевого слова, количество артефактов, связанных с ключевым словом (3, ложка, меч и вилка), количество ключевых слов, связанных артефактом между узлами ключевых слов (металл имеет 2 косвенных связи с едой и 1 с боевыми действиями).

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

MATCH (n:Keyword)-[r*2]-(x:Keyword)
WITH n, COUNT(r) AS c, x
LIMIT 1
MERGE (n)-[s:RELATED_KEY]-(x) SET s.weight = c

Я использую версию сообщества neo4j (2.1.6),

Большое спасибо, Энди


person Garbit    schedule 12.01.2015    source источник


Ответы (1)


Этот запрос вернет вам первую часть вашего ответа:

MATCH (k:Keyword)
WITH k
LIMIT 1
MATCH (k)<-[:HAS]-(a)
WITH k, collect(a) as artefacts
WITH k, artefacts, size(artefacts) as c
UNWIND artefacts as artefact
MATCH (k)<-[:HAS]-(artefact)-[:HAS]->(k2)
RETURN c, artefacts, collect(distinct(k2.name)) as keywords, count(distinct(k2.name)) as keyWordsCount

введите здесь описание изображения

Однако я предполагаю, что вы можете напрямую создавать отношения между связанными узлами:

MATCH (k:Keyword)
WITH k
LIMIT 1
MATCH (k)<-[:HAS]-(a)-[:HAS]->(other)
MERGE (k)-[r:RELATED_TO]->(other)
ON CREATE SET r.weight = 1
ON MATCH SET r.weight = r.weight + 1
person Christophe Willemsen    schedule 12.01.2015