H-i,我想在D3中显示一个力导向图。我试图用Neo4j模拟它。
要求是装饰"主题"和"边缘"与"附件"。主题和边缘显示在D3图表中。主题或边缘的详细视图中的附件。
这是概念模型(D3中的主题和边缘):
(attach1) -> (topic1) --edge12--> (topic2) <--edge23-- (topic3) <- (attach2)
| | | |
(attach3) (attach4) (attach4) (attach5)
最简单的事情似乎不起作用:
Topics -> Nodes
Edges -> Relationships
Attachments -> Nodes
Neo4j没有&#34; hyperedges&#34;,所以相反:
Topics -> Nodes
Edges -> Nodes that relate only to Topics
Attachments -> Nodes that relate to Topics and Edges
那不稳定,但可行。另一种方法是使用附件ID制作一个Edge属性,但这看起来很麻烦。
下一个要求是进行&#34;多主题搜索&#34;,这是2个主题之间的最短路径列表 - 但仅限于主题和边缘。
我发现these questions让我不完全理解,但似乎解释了如何过滤结果。对于OLAP来说,他们看起来并不是很有效。
有没有更好的方法在Neo4j中对此有向图进行建模?
有没有更好的方法来进行过滤的多节点搜索?
谢谢!
答案 0 :(得分:2)
[增订]
出于历史兴趣,以及与最终解决方案的比较,下面是我的原始答案。
由于您无法将关系直接连接到其他关系,因此您可以将Edge
称为节点。例如,这是一个可能的模型:
(:Attachment) -[:FOR]-> (:Topic)
(:Attachment) -[:FOR]-> (:Edge)
(:Topic) <-[:FROM]- (:Edge) -[:TO]-> (:Topic)
以下是查询找到任意2个特定Topics
之间的最短路径(或路径,如果存在平局):
MATCH (t1:Topic { id: 't1' }), (t2:Topic { id: 't2' })
RETURN ALLSHORTESTPATHS((t1)-[:FROM|TO*]-(t2))
和here is a console进行演示。
警告:上述查询并未强制执行“明智”的方向性。因此,例如,假设数据看起来像这样(为了简单起见,我用箭头替换Edge
个节点):(t1)->(t2)<-(t3)
。如果我们想要从t1
到t3
的最短路径,我的查询将返回由t1
,t2
和t3
组成的路径,即使您不能从t2
转到t3
。应该可以实现敏感性,但会使查询更复杂......
为了启用“明智的”方向性(见上文),我们只需对原始数据模型进行微小的更改,方法是使每个Edge
点之间的关系朝向同一方向。
也就是说,而不是这样做:
(:Topic) <-[:FROM]- (:Edge) -[:TO]-> (:Topic)
我们这样做:
(:Topic) -[:TO_EDGE]-> (:Edge) -[:FROM_EDGE]-> (:Topic)
使用这种改进的数据模型,以下查询将强制执行“明智的”方向性。请注意查询现在如何包含<
或>
箭头以指示所需的方向性:
MATCH (t1:Topic { id: 't1' }),(t2:Topic { id: 't2' })
RETURN ALLSHORTESTPATHS((t1)-[:FROM_EDGE|TO_EDGE*]->(t2))
Here is a console演示了这种改进的数据模型和查询。它将2边路径(从t1
返回到t2
)作为“最短路径”,因为1边路径具有错误的方向性。
答案 1 :(得分:1)
这种图形结构怎么样:
(topic_attachment_1)--(topic1)--(edge_attachment_1_2)--(topic2)--(topic_attachment_2)
| |
(topic3) topic(4)
基本上,我们的想法是将附件建模为节点;主题附件只是挂起主题,其中边缘附件位于两个主题之间(因此边缘附件要求您将边缘分成两个边。