投影图neo4j上的度中心。创建投影图的最佳方法

时间:2019-06-10 14:48:30

标签: neo4j graph-algorithm

我正在尝试图算法Degree

我的模型有几个节点和关系标签,其中一个是“ Entity”,而让另一个标签称为“ Random”。

我要创建的是图形的投影,该投影基本上删除了除“实体”以外的所有其他节点,但保留了节点可能存在的边/关系。

例如,如果我们有(e1:Entity) -> (:Random) -> (:Random) -> (e2:Entity),则结果为(e1) -> (e2)

(e1:Entity)-[*..5]-(e1:Entity)给了我们(e1)--(e2)

两个实体之间的路径之间没有实体。

我当前的cypher语句存在的问题是,它似乎很慢,或者没有返回我期望的结果。所以我想知道我是否错过了什么。

这是我当前用于创建投影的内容:

MATCH p = (start:Entity)-[*..5]-(end:Entity)
WHERE start.id <> end.id
WITH start, end, [n IN nodes(p) WHERE 'Entity' in labels(n) | n] as entities
WHERE size(entities) = 2
RETURN id(start) as source, id(end) as target

1 个答案:

答案 0 :(得分:1)

您的用例(查找并测试以Entity节点结尾的长度为5的所有路径)本来就很昂贵。

话虽如此,以下查询应该更快一些。

  • 此查询仅测试内部路径节点的标签。
  • 由于查询是非定向的,因此该查询避免了两次对同一路径进行标签测试(通过start.id > end.id测试)。
  • 它避免创建临时节点集合并评估其大小。

    MATCH p = (start:Entity)-[*..5]-(end:Entity)
    WHERE start.id > end.id AND NONE(n IN NODES(p)[1..-1] WHERE 'Entity' in LABELS(n))
    RETURN ID(start) as source, ID(end) as target