度中心算法 returns 只有 0.0 作为分数

Degree centrality algorithm returns only 0.0 as score

我正在尝试 运行 我的数据集上的度中心算法。我查询的子模型如下所示:

(transfer:Transfer)-[:PARENT_TRANSFER]->(hasUnderlyingBatch:HasUnderlyingBatch)

我正在尝试的查询 运行:

CALL algo.degree.stream("Transfer", "PARENT_TRANSFER", {direction:"outgoing"}) YIELD nodeId, score 
RETURN nodeId, score ORDER BY score DESC

我已经验证了这些关系的存在,但我仍然为每条记录获得了 0.0 分。

当我自己执行查询时,我确实得到了正确的结果:

MATCH (t:Transfer) 
RETURN t.Code, size((t)-[:PARENT_TRANSFER]->()) as score 
ORDER BY score DESC

谁能给我解释一下为什么我在使用度中心算法时得不到正确的结果?

您的 PARENT_TRANSFER 关系介于节点 TransferHasUnderlyingBatch 之间。

或者在algo的调用中,你只使用了标签为Transfer的节点,所以没有结果是正常的。

如果你真的想在你的TransferHasUnderlyingBatch之间做一个算法,你需要做的是你的图表cypher projection(但对我来说这似乎很奇怪,因为你混合了苹果和香蕉)。

这些算法在相同类型的节点中找到一个中心节点(即检查相同类型节点之间的关系)。

在您的案例中,关系 PARENT_TRANSFER 存在于两种不同类型的节点之间:TransferHasUnderlyingBatch。但是,算法正在 Transfer 节点之间搜索 PARENT_TRANSFER

您可以在图表上验证这一点,该图表在社交网络图表中具有相同类型节点之间的任何关系,例如 FOLLOW Person 节点之间的关系。

我在文档中没有看到任何忽略相同标签搜索的配置设置。

我知道这是一个较旧的线程,但由于我刚刚解决这个问题,所以我会添加希望它能帮助其他人。花哨的术语是单方支持。这就是该算法的帮助。意思是,如文献中的示例,(:A)-[:R]->(:A)。因此,一个图成为一个二分图或更大的图——即添加一个 "B" 节点标签,将在分数 return 值中创建零,因为这就是他们构建它的方式。除非,您为节点和关系的算法中的参数输入了空值。有些人建议 "trick" 使算法中的前两个值都为空值:[CALL algo.degree(null, null...]。这对让你的分数>0 有效,但当你有多个关系并且与一个节点有关系时,可能不会给你正确的度数。

但是,如果您为第一个参数(用于节点)和您想要的关系(比如“:R”)输入 null,那么您将获得具有 incoming/outgoing/both 的所有节点的度数你的分值将是正确的。我建议任何使用图形的人,尽管有不便,但始终使用有向图。这是诚实的,"correct" 并且会让学位分数之类的事情更容易得到正确的结果。我的 0.02.

文档可能会更好。这不是直观的,但我希望这会有所帮助。度中心性是一种基本且非常有价值的算法。

最后一点,如果您要升级到 3.5(还不是 4.x),请从 algo.* 升级到 gds.*。我还没有检查过,但我希望他们改进了这个算法,使它更清晰一些。

HTH!