Neo4j db设计。边缘有关系吗?过滤后的最短路径?

时间:2015-05-29 03:58:54

标签: neo4j

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中对此有向图进行建模?

有没有更好的方法来进行过滤的多节点搜索?

谢谢!

2 个答案:

答案 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)。如果我们想要从t1t3的最短路径,我的查询将返回由t1t2t3组成的路径,即使您不能从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)

基本上,我们的想法是将附件建模为节点;主题附件只是挂起主题,其中边缘附件位于两个主题之间(因此边缘附件要求您将边缘分成两个边。