Neo4j:从叶到父级迭代并查找公共子级

Neo4j:从叶到父级迭代并查找公共子级,neo4j,cypher,Neo4j,Cypher,我已经将我的关系数据库迁移到neo4j,并且正在研究在我投入新系统之前是否可以实现一些功能。我刚刚读了两本neo4j的书,但不幸的是,它们没有涵盖我希望更显而易见的两个关键特性。对于这些东西是否易于实现,或者我是否应该坚持使用sql,我将非常感谢您的快速建议!谢谢 我需要的功能包括: 1) 我运行了一个脚本,将:leaf label分配给树中的所有节点。在已知节点与其相关叶节点之间的路径中,我的目标是为每个节点分配一个级别属性,该属性反映该节点从已知节点(或叶节点-我可以最容易地工作的任何节点)

我已经将我的关系数据库迁移到neo4j,并且正在研究在我投入新系统之前是否可以实现一些功能。我刚刚读了两本neo4j的书,但不幸的是,它们没有涵盖我希望更显而易见的两个关键特性。对于这些东西是否易于实现,或者我是否应该坚持使用sql,我将非常感谢您的快速建议!谢谢

我需要的功能包括: 1) 我运行了一个脚本,将:leaf label分配给树中的所有节点。在已知节点与其相关叶节点之间的路径中,我的目标是为每个节点分配一个级别属性,该属性反映该节点从已知节点(或叶节点-我可以最容易地工作的任何节点)的跳数

我试过:
匹配路径=(n:Leaf)-[:R*]->(:Parent{Parent\u ID:$known\u value})
使用n,长度(节点(路径))作为跃点
设置n.Level2=跳数

path=(n:Leaf)-[:R*]->(:Parent{Parent\u ID:$known\u value})
以n、路径、长度(节点(路径))作为跃点
关系(路径)中的foreach(n)|
设置n.Level=跳数)

第一个属性将值为路径全长的属性仅指定给叶节点。第二个属性将值为路径全长的属性指定给路径中的所有关系

我应该改为使用shortestpath,为所有节点创建一个值为1的伪属性,并迭代地添加该属性的权重吗

2) 我需要找到给定父节点的公共子节点。例如,我的孩子们都[:喜欢]很多电影,我想从我自己到孩子们共同喜欢的电影之间建立[:喜欢]关系(因此,如果1/3的孩子喜欢一部电影,那么我也喜欢,但是如果3/2的孩子喜欢一部电影,那么什么都不会发生)

我在这里找到了一个具有三条路径的解决方案: 但是我需要一个适用于任意数量路径(从1开始)的解决方案

3) 然后,我计划从我最远的叶子节点开始,创建与儿童电影的关系,并逐步向我已知的节点移动,然后重复创建关系,这样最顶级的祖父母只喜欢所有孩子(所有孩子的所有孩子…)共同喜欢的电影,如果有一部电影大家都同意,这是整个大家庭周六晚上要看的电影

neo4j能做到这一点吗?对于一个拥有基本密码的人来说,这是一项多么艰巨的任务?这主要是我在关系数据库中如何实现的/我应该在图形数据库中以完全不同的方式实现它吗

非常感谢你的建议。谢谢

1.

当已经匹配的开始和结束节点不是根节点和叶节点时,shortestPath()可能会有所帮助,因为一旦找到第一条路径,它就不会继续寻找其他路径。如果已经匹配的开始节点和结束节点是根节点和叶节点,而图形是树结构(非循环),那么就没有真正的理由使用shortestPath()

通常,当设置树中节点的深度时,您会使用
长度(路径)
,因此根深度为0,子节点深度为1

通常,深度是相对于根节点而不是叶节点计算的(因为中间节点可能是距离不同的多个叶节点的祖先)。将深度作为距离根部的距离,使深度一致

您在关系上设置属性的方法将是一个问题,因为相同的关系可能存在于不同深度的多个叶节点的多个路径中。您的查询可能会反复覆盖同一关系上的属性,直到最后一次写入成功。最好向下匹配到所有节点(在查询中省略
:Leaf
),获取路径中的最后一个关系,并设置其深度:

MATCH path=(:Parent {Parent_ID: $known_value})<-[:R*]-()
WITH length(path) as length, last(relationships(path)) as rel
SET rel.Level = length

MATCH path=(:Parent{Parent\u ID:$known\u value})OMG这是金色的。非常感谢。我需要几天时间才能把它完全消化;o) 不客气!如果您在建议的过程中遇到任何问题,请告诉我们:“只有在[…]树中没有其他中间节点与电影有任何类似关系的情况下,才会按照您认为的方式工作。”难道没有任何中间节点的个人电影偏好与其子代的电影偏好一起计入电影类中吗?你特别想到了什么情景?我试过几次,似乎有效,但我毫不怀疑你是对的!哈哈。childCount是否有一种方法可以对相关节点进行计数,而不是对与相关节点的关系进行计数?对于不懂java的人,你推荐什么样的Cypher/APOC书?我的警告是,你假设通过建立一棵树到根,“这样最高的祖父母只喜欢所有孩子(所有孩子的所有孩子…)共同喜欢的电影”,但如果中间节点有自己的个人喜好,这将打破这一保证。假设树中间的某个节点喜欢“蜜蜂电影”,但是当你建立了喜欢的时候,并不是所有的孩子都这样做(也许没有一个),但是所有的兄弟节点都做了,剩下的计算允许这部电影传播到顶端。这违反了你的要求。啊,我明白了。但事实上这正是我想要的!超级的!
MATCH path=(:Parent {Parent_ID: $known_value})<-[:R*0..]-(n)
WITH n, size((n)<-[:R]-()) as childCount
MATCH (n)<-[:R]-()-[:like]->(m:Movie)
WITH n, childCount, m, count(m) as movieLikes
WHERE childCount = movieLikes
MERGE (n)-[:like]->(m)
MATCH path=(:Parent {Parent_ID: $known_value})<-[:R*0..]-(n)
WHERE NOT n:Leaf // leaves should have :like relationships already created
WITH n, length(path) as depth, size((n)<-[:R]-()) as childCount
ORDER BY depth DESC
CALL apoc.cypher.doIt("
 MATCH (n)<-[:R]-()-[:like]->(m:Movie)
 WITH n, childCount, m, count(m) as movieLikes
 WHERE childCount = movieLikes
 MERGE (n)-[:like]->(m)
 RETURN count(m) as relsCreated",
 {n:n, childCount:childCount}) YIELD value
RETURN sum(value.relsCreated) as relsCreated