Визуализация отношений родительского ребенка, сопоставление образцов и полнотекстовый поиск

79
9

У меня есть набор данных, как показано ниже:

Parent  ID    Path      GrandParent  GrandParentID   Child  ModPath 
John 100 home\123 Matt 50 Ian Ian\123
John 100 home\123 Matt 50 Andrew Andrew\123
John 100 home\123 Matt 50 Danny Danny\123

Как лучше всего представить свои данные в Kibana/elasticsearch, чтобы показать эту родительскую дочернюю структуру для каждого события? В идеале я хотел бы классифицировать этот набор выше как одно событие, подобное тому, которое я могу описать ниже в Python Pandas с groupby.

Parent  ID    Path      GrandParent  GrandParentID   Child    ModPath 
John 100 home\123 Matt 50 Ian Ian\123
Andrew Andrew\123
Danny Danny\123

Если kibana/elasticsearch не лучший метод/набор инструментов для использования, будут ли какие-либо другие инструменты/методы, которые вы могли бы рекомендовать для визуализации и ссылок на это с открытым исходным кодом?

В идеале я хотел бы найти родителя, ребенка или бабушку и дедушку и показать все отношения и свойства отношений визуально и/или в таблице.

Python был тегом, который использовался из-за ссылки на pandas.

спросил(а) 2021-01-19T13:15:47+03:00 9 месяцев назад
1
Решение
65

Neo4j отлично подходит для сопоставления образцов и визуализации отношений. ElasticSearch лучше работает с полным текстовым поиском, но Neo4j должен иметь возможность обрабатывать это достаточно адекватно с некоторыми незначительными изменениями.

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

Пока давайте моделируем их как: Person node, с: отношениями CHILD между ними.

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

В Cypher, позвольте создать узлы в вашем примере графика:

create (matt:Person{name:'Matt', ID:50})
create (john:Person{name:'John', ID:100, path:'home/123'})
create (ian:Person{name:'Ian', path:'Ian/123'})
create (andrew:Person{name:'Andrew', path:'Andrew/123'})
create (danny:Person{name:'Danny', path:'Danny/123'})

create (matt)-[:CHILD]->(john)
create (john)-[:CHILD]->(ian)
create (john)-[:CHILD]->(andrew)
create (john)-[:CHILD]->(danny)

Затем давайте проверим там строчные версии своих имен, чтобы воспользоваться поиском индексов:

match (p:Person)
set p.lowerName = lower(p.name)

Затем мы добавим индекс в lowerName, чтобы любые будущие совпадения были быстрыми:

create index on :Person(lowerName)

И мы готовы сделать запрос.

Здесь мы используем жестко запрограммированный lookup нижнем регистре, но в реальной версии вы должны lookup параметр и запускать lower() на нем, чтобы получить его в нижнем регистре перед совпадением.

with 'ian' as lookup
// find the grandparent root node
match (:Person{lowerName:lookup})<-[:CHILD*0..]-(grandparent)
where size ((grandparent)<-[:CHILD]-()) = 0
with grandparent
match p=(grandparent)-[:CHILD]->(parent)-[:CHILD]->(child)
return parent.name as Parent, parent.ID as ID, parent.path as Path,
grandparent.name as GrandParent, grandparent.ID as GrandParentID,
collect(child {Child:child.name, ModPath:child.path}) as children,
collect(p) as path

Это будет работать независимо от того, какое имя вы используете в запросе. Он будет возвращать одну строку для каждой пары дедов + родителей, а также всех этих родительских детей. Сбор согласованных путей для детей обеспечивает графическое представление результатов, несмотря на прогнозы.

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

Здесь результирующие строки и столбцы (игнорируя столбец пути): enter image description here

Здесь графический вид результатов: enter image description here

ответил(а) 2021-01-19T13:15:47+03:00 9 месяцев назад
46

У эластичного поиска есть функция "внутренние", чтобы приложить родителей и детей по мере необходимости в результате. Если этот результат будет передан в neo4j, у вас будет визуальный

ответил(а) 2021-01-19T13:15:47+03:00 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема