如何根据节点标签或其他条件计算自定义程度?

时间:2018-07-31 20:00:28

标签: neo4j cypher

我有一种情况,我需要计算第一个节点(:employee)之间的自定义度,该度仅应在该节点的标签为:natural或{{1}时才递增到另一个节点},但不是:relative时。

示例: enter image description here

问题是我无法根据需要生成此:legal属性。

到目前为止,我尝试过使用FOREACH和CASE,但没有运气。我最接近获得某种计算出的自定义程度的是:

custom degree

但是即使这样也不正确,因为尽管有5个不同的节点,但我还是得到了match p = (:employee)-[*5..5]-() WITH distinct nodes(p) AS nodes FOREACH(i IN RANGE(0, size(nodes)) | FOREACH(node IN [nodes[i]] | SET node.degree = i )) return * limit 1 ,因为出于某种原因,SIZE(nodes) = 6节点占了两倍。

有人知道如何在单个密码查询中实现我的目标吗?

此外,如果您知道:legal节点为何占两次,请告诉我。我怀疑是因为它有2个与之相关的:legal节点,但不知道使它出现两次的内部工作原理。

更多上下文:

:natural节点是组织的员工

:employee节点是某员工的亲戚

:relative节点是自然人,可能与:natural相关

:legal节点是可能与某个:legal:employee:relative或另一个:natural相关的公司(法人)在:legal关系中,他们实际上是董事会成员或该公司的股东(IS_PARTNER)。

:legal是我要创建的目标,它将在给定该项目某些条件的情况下定义一个节点与另一个节点的距离(以下指定)。

所有节点都具有custom degree属性,该属性是通过合同获得的总金额。

目标是找到与具有total_contracts且最高为total_contracts > 0的另一个节点有关系的任何员工,因为员工可能会从外部资源那里收钱,而他们本来不应该这样做。

关于为什么我需要这个自定义程度而不考虑它是custom degree <= 3节点时的距离的原因,是因为我们威胁公司的距离与作为合伙人的自然人的距离相同。

在上述示例中,员工有一个儿子:legal,该儿子是公司(DIEGO的股东),还有两个其他业务伙伴(ALLURE和{{ 1}})。当我问儿子对雇员的程度如何时,我应该得到JOSE,因为他们是直接相关的;当我问ROSIEL对员工的程度如何时,我应该得到1,因为JOSE2JOSE相关,我们不应该递增公司的自定义度,只有一个人时的自定义度。

1 个答案:

答案 0 :(得分:1)

这种类型的图的窍门是确保避免出现循环返回相同节点的路径(这肯定会发生很多,因为您使用的是节点之间的多个关系,而不仅仅是一个...可能需要确保这在您的模型中是必需的。

最简单的方法是通过APOC Procedures,因为您可以调整遍历的唯一性,以使节点在每个路径中都是唯一的。

因此,例如,对于特定的起始节点(假设:employee具有empId:1只是为了模拟该节点的查找,我们将为距离5跳内的所有节点计算一个度数这里的想法是我们将获取路径的长度(跳数)-路径中的:legal节点的数量(通过仅过滤路径中的:legal节点,然后得到该过滤列表的大小)。

MATCH (e:employee {empId:1})
CALL apoc.path.expandConfig(e, {minLevel:1, maxLevel:5, uniqueness:'NODE_PATH'}) YIELD path
WITH e, last(nodes(path)) as endNode, 
 length(path) - size([x in nodes(path) WHERE x:legal]) as customDegree
RETURN e, endNode, customDegree