投影图 neo4j 的度中心性。创建投影图的最佳方式
Degree centrality on projected graph neo4j. Optimal way to create projected graph
我正在尝试图形算法 Degree。
我的模型有几个节点和关系标签,其中一个是 "Entity",我们称其他标签为 "Random"。
我想要创建的是图形的投影,它基本上删除了除 "entity" 之外的所有其他节点,但保留了节点可能存在的 edges/relationships。
例如,如果我们有 (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
您的用例(查找和测试以 Entity
个节点结束的长度不超过 5 的所有路径)本质上 昂贵。
也就是说,下面的查询应该会快一些。
- 此查询仅测试内部路径节点的标签。
- 由于您的查询是 non-directional,此查询避免了 label-testing 相同的路径两次(通过
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
我正在尝试图形算法 Degree。
我的模型有几个节点和关系标签,其中一个是 "Entity",我们称其他标签为 "Random"。
我想要创建的是图形的投影,它基本上删除了除 "entity" 之外的所有其他节点,但保留了节点可能存在的 edges/relationships。
例如,如果我们有 (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
您的用例(查找和测试以 Entity
个节点结束的长度不超过 5 的所有路径)本质上 昂贵。
也就是说,下面的查询应该会快一些。
- 此查询仅测试内部路径节点的标签。
- 由于您的查询是 non-directional,此查询避免了 label-testing 相同的路径两次(通过
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