elasticsearch,neo4j,kibana,Python,elasticsearch,Neo4j,Kibana" /> elasticsearch,neo4j,kibana,Python,elasticsearch,Neo4j,Kibana" />

Python 父子关系可视化、模式匹配和全文搜索

Python 父子关系可视化、模式匹配和全文搜索,python,elasticsearch,neo4j,kibana,Python,elasticsearch,Neo4j,Kibana,我的数据集如下所示: 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 Mat

我的数据集如下所示:

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 with 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而使用的标记

Elastic Search具有innerhits功能,可根据结果中的要求将父项和子项括起来。如果将此结果反馈给neo4j,您将获得预期的视觉效果

neo4j在模式匹配和关系可视化方面非常出色。ElasticSearch与全文搜索相比更好,但Neo4j应该能够通过一些小的改动充分处理这一问题

下面是一个如何在Neo4j中对此进行建模和查询的示例,以及查询的表格和图形结果。您可以使用它与其他答案和您尝试的其他解决方案进行比较

现在,让我们将这些节点建模为:Person节点,它们之间有:子关系

您没有暗示数据会扩展到这三代之外,所以现在让我们假设数据库中的所有结构都遵循这种模式

在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)
我们已经准备好提问了

这里我们使用的是硬编码的小写
查找
,但在实际版本中,您需要将
查找
作为参数,并在其上运行
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
以“ian”作为查找
//查找祖父母根节点
匹配(:Person{lowerName:lookup})(子项)
返回parent.name作为parent,parent.ID作为ID,parent.path作为path,
祖父母.name作为祖父母,祖父母.ID作为祖父母,
作为子对象收集(子对象{child:child.name,ModPath:child.path}),
收集(p)作为路径
无论在查询中使用哪个名称,这都将起作用。它将为每个祖父+父对以及该父项的所有子项返回一行。收集到子级的匹配路径可确保在不考虑投影的情况下,结果的图形视图可用

当然,您可以根据要公开的数据以不同的方式执行投影,或者直接返回节点,其中将包括节点的所有属性

以下是结果行和列(忽略路径列):

以下是结果的图形视图:

您的数据中的所有模式是否只有3代,且基数相似(1个祖父母、1个父母、多个子女)?链可以有很多种方式,例如一个完整的谱系20步或更多。在这种情况下,如果是谱系树,而不是只有多个叶节点,您希望分组如何工作?您是否正在寻找一个在本地工作的查询,使用搜索词匹配父项,并从中仅获取祖父母和子女?如果没有,请从更复杂的数据模型中给我们一些所需的样本输出。这看起来很棒,我认为会很棒,因为我不熟悉neo4j的工作原理,是否可以通过导入实现创建?我有数千个csv文件,其中包含数据集,这些数据集需要以这种方式接收。是的,Neo4j有,从导入工具到使用LOAD csv通过Cypher直接加载。