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直接加载。