Parent Child 关系可视化、模式匹配和全文搜索
Parent Child relationship visualization, pattern matching and full text searching
我有如下数据集:
Parent ID Path GrandParent GrandParentID Child ModPath
John 100 home3 Matt 50 Ian Ian3
John 100 home3 Matt 50 Andrew Andrew3
John 100 home3 Matt 50 Danny Danny3
如何才能最好地在 Kibana/elasticsearch 中表示我的数据以显示每个事件的 parent child 结构?理想情况下,我想将上面的这个集合分类为单个事件,就像我可以在下面的 Python Pandas 中使用 groupby 一样。
Parent ID Path GrandParent GrandParentID Child ModPath
John 100 home3 Matt 50 Ian Ian3
Andrew Andrew3
Danny Danny3
如果 kibana/elasticsearch 不是最好的 method/toolset 使用,您是否可以推荐任何其他 toolsets/methods 开源的可视化和参考?
理想情况下,我希望能够搜索 parent、child 或 grandparent 并以可视化和/或 [= 形式显示所有关系和关系的属性36=].
Python 是由于引用 pandas 而使用的标签。
Elastic Search 具有 innerhits 功能,可以根据需要在结果中包含父项和子项。如果将此结果提供给 neo4j,您将获得预期的视觉效果
Neo4j 擅长模式匹配和关系可视化。 ElasticSearch 更适合全文搜索,但 Neo4j 应该能够通过一些小的更改充分处理。
下面是一个示例,说明如何在 Neo4j 中对其进行建模和查询,以及查询的表格和图形结果。您可以使用它来与其他答案和您尝试的其他解决方案进行比较。
现在让我们将它们建模为 :Person 节点,它们之间具有 :CHILD 关系。
您没有暗示数据会比这三代更进一步,所以现在假设数据库中的所有结构都遵循这种模式。
在 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)
我们已经准备好进行查询了。
这里我们使用 hard-coded 小写字母 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
无论您在查询中使用哪个名称,这都有效。每个祖父 + parent 对 return 一行,以及所有 parent 的 children。收集到 children 的匹配路径可确保结果的图形视图可用,尽管有投影。
当然,您可以根据要公开的数据执行不同的投影,或者直接 return 节点,这将包括它们的所有属性。
我有如下数据集:
Parent ID Path GrandParent GrandParentID Child ModPath
John 100 home3 Matt 50 Ian Ian3
John 100 home3 Matt 50 Andrew Andrew3
John 100 home3 Matt 50 Danny Danny3
如何才能最好地在 Kibana/elasticsearch 中表示我的数据以显示每个事件的 parent child 结构?理想情况下,我想将上面的这个集合分类为单个事件,就像我可以在下面的 Python Pandas 中使用 groupby 一样。
Parent ID Path GrandParent GrandParentID Child ModPath
John 100 home3 Matt 50 Ian Ian3
Andrew Andrew3
Danny Danny3
如果 kibana/elasticsearch 不是最好的 method/toolset 使用,您是否可以推荐任何其他 toolsets/methods 开源的可视化和参考?
理想情况下,我希望能够搜索 parent、child 或 grandparent 并以可视化和/或 [= 形式显示所有关系和关系的属性36=].
Python 是由于引用 pandas 而使用的标签。
Elastic Search 具有 innerhits 功能,可以根据需要在结果中包含父项和子项。如果将此结果提供给 neo4j,您将获得预期的视觉效果
Neo4j 擅长模式匹配和关系可视化。 ElasticSearch 更适合全文搜索,但 Neo4j 应该能够通过一些小的更改充分处理。
下面是一个示例,说明如何在 Neo4j 中对其进行建模和查询,以及查询的表格和图形结果。您可以使用它来与其他答案和您尝试的其他解决方案进行比较。
现在让我们将它们建模为 :Person 节点,它们之间具有 :CHILD 关系。
您没有暗示数据会比这三代更进一步,所以现在假设数据库中的所有结构都遵循这种模式。
在 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)
我们已经准备好进行查询了。
这里我们使用 hard-coded 小写字母 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
无论您在查询中使用哪个名称,这都有效。每个祖父 + parent 对 return 一行,以及所有 parent 的 children。收集到 children 的匹配路径可确保结果的图形视图可用,尽管有投影。
当然,您可以根据要公开的数据执行不同的投影,或者直接 return 节点,这将包括它们的所有属性。