Петля Neo4j для всех детей - PullRequest
       11

Петля Neo4j для всех детей

0 голосов
/ 12 ноября 2018

В Neo4j я получил следующие узлы: enter image description here

Как видите, это братья и сестры, связанные отношениями как NEXT или NEXT_SIBLING; кроме того, первый и последний дочерние элементы связаны с отцом с помощью FIRST_CHILD_OF и LAST_CHILD_OF.

Я просто хочу найти способ их циклического создания, чтобы создать единственную строку, которая является «A B C D».

Есть ли запрос Cypher, способный на это?

1 Ответ

0 голосов
/ 12 ноября 2018

Создание вашей модели

Для простоты возможных дальнейших ответов и решений отмечу мое утверждение создания графа:

CREATE
  (ormText:OrmText {name: 'orm_Text'})<-[:FIRST_CHILD_OF]-(letterA:Letter {name: 'A'}),
  (letterA)-[:NEXT]->(letterB:Letter {name: 'B'}),
  (letterA)-[:NEXT_SIBLING]->(letterB),
  (letterB)-[:NEXT]->(letterC:Letter {name: 'C'}),
  (letterB)-[:NEXT_SIBLING]->(letterC),
  (letterC)-[:NEXT]->(letterD:Letter {name: 'D'}),
  (letterC)-[:NEXT_SIBLING]->(letterD),
  (letterD)-[:LAST_CHILD_OF]->(ormText);

graph

Решение

MATCH
  letterPath = (startLetter)-[:NEXT|NEXT_SIBLING*]->(endLetter)
WHERE 
  (startLetter)-[:FIRST_CHILD_OF]->(:OrmText)<-[:LAST_CHILD_OF]-(endLetter)
WITH nodes(letterPath) AS letterNodes
UNWIND letterNodes AS letterNode
RETURN DISTINCT letterNode.name AS letterName;

Вторая строка определяет startLetter как первый дочерний элемент orm_Text и endLetter как последний дочерний элемент orm_Text. В пятой строке вычисляется путь между начальной и конечной буквой, его узлы извлечены в шестой строке. Строка семь создает одиночные узлы, а строка восемь, наконец, возвращает результат.

Примечание: При написании -[:NEXT|NEX_SIBLING*]-> отношение типа NEXT или NEXT_SIBLING действительно для совпадения. Если вашему требованию нужен только один конкретный тип, удалите другой и |.

Результат

╒════════════╕
│"letterName"│
╞════════════╡
│"A"         │
├────────────┤
│"B"         │
├────────────┤
│"C"         │
├────────────┤
│"D"         │
└────────────┘

Extension

Если вы предпочитаете вывод в одном String вместо списка имен узлов, взгляните на следующее решение.

Решение

MATCH
  letterPath = (startLetter)-[:NEXT|NEXT_SIBLING*]->(endLetter)
WHERE 
  (startLetter)-[:FIRST_CHILD_OF]->(:OrmText)<-[:LAST_CHILD_OF]-(endLetter)
WITH nodes(letterPath) AS letterNodes
RETURN DISTINCT reduce(s=head(letterNodes).name, n in tail(letterNodes) | s+" -> "+n.name) AS letterString;

Результат

╒══════════════════╕
│"letterString"    │
╞══════════════════╡
│"A -> B -> C -> D"│
└──────────────────┘
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...