Визуализация отношений родительского ребенка, сопоставление образцов и полнотекстовый поиск
У меня есть набор данных, как показано ниже:
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.
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
Это будет работать независимо от того, какое имя вы используете в запросе. Он будет возвращать одну строку для каждой пары дедов + родителей, а также всех этих родительских детей. Сбор согласованных путей для детей обеспечивает графическое представление результатов, несмотря на прогнозы.
Вы можете, конечно, выполнять проекции по-разному, в зависимости от данных, которые вы хотите разоблачить, или просто сразу вернуть узлы, которые будут включать все их свойства.
Здесь результирующие строки и столбцы (игнорируя столбец пути):
У эластичного поиска есть функция "внутренние", чтобы приложить родителей и детей по мере необходимости в результате. Если этот результат будет передан в neo4j, у вас будет визуальный