1

我不确定这个标题的措辞是否很好,但不知道该怎么做。我正在用一些数据填充 Neo4j 数据库。

数据主要是从我拥有的关于成对用户的数据中生成的。用户之间存在百分比关系,例如:

   80
A ---> B

但反向关系不一样:

   60
A <--- B

我可以把这两种关系都放进去,但我想我可以做的是使用平均值:

   70
A <--> B

但我愿意接受这里的建议。

我想在 Neo4j 中做的是获取相关用户组。例如,我想获得一组平均百分比 > 50 的用户。所以,如果我们有:

      A
40  /   \  60
   B --- C ------ D
     20      70

我们会得到一个子集,比如:

      A
        \  60
         C ------ D
             70

我不知道该怎么做。另一件事是我很确定不可能从任何其他节点到达任何节点,我认为它是脱节的。比如,几个大图。但我希望能够获得上述所有内容,即使某些节点组与其他节点完全分开。

作为数字的概念,将有大约 100,000 个节点和 550,000 条边

4

2 回答 2

2

几个想法。

首先,如果您的图表没有连接,那很好,但是您需要某种方式来访问您想要分析的每个组件。在 Neo4j 中的断开连接的图中,这要么意味着 Lucene 索引、一些包含节点或关系 ID 的外部“索引”,要么迭代数据库中的所有节点或关系(这很慢,但可能是您的问题所需要的)。

其次,虽然我不知道您的领域,但请意识到坚持原始表示和权重可能没问题。Neo 没有无向边(尽管您可以忽略边方向),您以后可能需要这些数据。OTOH,您采用权重平均值的修改确实简化了您的分析。

第三 - 根据图表的大小和特征,这可能会非常慢。听起来您希望子图中的所有连接组件都从权重大于 50 的边构建。AFAIK,这需要对数据库进行 O(N) 操作,其中 N 是数据库中的边数。您可以遍历数据库中的所有边,根据它们的权重进行过滤,然后从那里进行聚类。

使用 Gremlin/Groovy,你可以很容易地做到这一点。查看Gremlin 文档

另一种方法可能是在插入数据时进行某种迭代聚类。在我看来,这可能是一个显着的实际性能改进,尽管它没有绕过 O(N) 的必要性。

于 2012-06-15T17:27:35.370 回答
1

也许像http://tinyurl.com/c8tbth4这样的东西在这里适用?

start a=node(*) match p=a-[r]-()-[t]-() where r.percent>50 AND t.percent>50 return p, r.percent, t.percent
于 2012-06-16T14:18:45.190 回答