[英]Neo4j Versioning Relationships with Time Property
我正在尝试为树结构的版本控制系统建模。 例子如下:
树的版本1:
(a)<-[:BELONGS_TO]-(b)
(a)<-[:BELONGS_TO]-(c)
(d)<-[:BELONGS_TO]-(e)
树的版本2:
(a)<-[:BELONGS_TO]-(c)
(d)<-[:BELONGS_TO]-(b)
(d)<-[:BELONGS_TO]-(e)
因此,在版本2中,我将B移到了D。实际上,现在我可以通过创建一个版本节点并将其与所有包含的节点相关联,并在每个BELONGS_TO关系上赋予time属性来实现这一点。 因此该图将如下所示:
版本1
MERGE (a:COMPONENT {name:'a'})
MERGE (b:COMPONENT {name:'b'})
MERGE (c:COMPONENT {name:'c'})
MERGE (d:COMPONENT {name:'d'})
MERGE (e:COMPONENT {name:'e'})
MERGE (version:VERSION {createdOn:'16-4-2015 12:17:00'})
MERGE (version)-[:CONTAINS]->(a)
MERGE (version)-[:CONTAINS]->(b)
MERGE (version)-[:CONTAINS]->(c)
MERGE (version)-[:CONTAINS]->(d)
MERGE (version)-[:CONTAINS]->(e)
MERGE (a)<-[:BELONGS_TO {createdOn:'16-4-2015 12:17:00'}]-(b)
MERGE (a)<-[:BELONGS_TO {createdOn:'16-4-2015 12:17:00'}]-(c)
MERGE (d)<-[:BELONGS_TO {createdOn:'16-4-2015 12:17:00'}]-(e)
RETURN *
版本2
MERGE (a:COMPONENT {name:'a'})
MERGE (b:COMPONENT {name:'b'})
MERGE (c:COMPONENT {name:'c'})
MERGE (d:COMPONENT {name:'d'})
MERGE (e:COMPONENT {name:'e'})
MERGE (version:VERSION {createdOn:'28-5-2015 13:00:00'})
MERGE (version)-[:CONTAINS]->(a)
MERGE (version)-[:CONTAINS]->(b)
MERGE (version)-[:CONTAINS]->(c)
MERGE (version)-[:CONTAINS]->(d)
MERGE (version)-[:CONTAINS]->(e)
MERGE (a)<-[:BELONGS_TO {createdOn:'28-5-2015 13:00:00'}]-(c)
MERGE (d)<-[:BELONGS_TO {createdOn:'28-5-2015 13:00:00'}]-(b)
MERGE (d)<-[:BELONGS_TO {createdOn:'28-5-2015 13:00:00'}]-(e)
RETURN *
我使用MERGE子句导入树结构,因为如果这些节点与新版本引用的节点相同,则我想重用先前版本的节点。 这样做的原因是,我不想丢失到树结构中每个节点的映射。
我的查询是这样的:
MATCH (version:VERSION)-[:CONTAINS]->(component:COMPONENT)
WHERE version.createdOn = '28-5-2015 13:00:00'
OPTIONAL MATCH
(component)-[rels:BELONGS_TO*]->(componentParents)
WHERE ALL(rel IN rels WHERE rel.createdOn = '28-5-2015 13:00:00')
RETURN *
关键是,我的方法正在工作,但是一旦树的版本变大(我说有10,000个版本,尽管这可能不是真正的场景),我就会担心性能。 以我的理解,它将需要将许多具有不同“ createdOn”值的关系进行比较,以获取所选版本的正确路径。 我的问题是,我的担忧正确吗? 像这样对树结构图建模是否合适? 如果不是,您如何建议一个更好的模型?
预先感谢您,任何想法将不胜感激!
版本控制不是一门精确的科学,尤其是在图形和用例中。 有很多方法可以根据您的需要进行操作。
当图形的大小增长时,您的模型可能会对性能产生影响。 对关系或节点属性(不为关系建立索引)的筛选是非常昂贵的操作。 通常,关系会驱动您进入图形并为其添加语义。
有一个表示节点状态的通用模式,例如,您将有一个表示Component的唯一节点和多个ComponentState节点,这些节点将随着时间的推移表示组件 的状态 。
在某些Ascii-Art中,您将:
(Component)-[:LAST_STATE]->(ComponentState {version:2})
-[:PREVIOUS_STATE]->(ComponentState {version: 1})
并在图像中:
然后,这些ComponentState节点将与belongs_to Component节点具有关系。
我用您的示例创建了一个Neo4j控制台:
http://console.neo4j.org/r/4trq7i
如果您需要了解Instant 1(请参见此处的版本)上的图形如何,则只需要在此瞬间匹配State组件并遍历BELONGS_TO关系:
MATCH (n:ComponentState {version: 1})
MATCH (n)-[:BELONGS_TO]->(parent)
RETURN n.name, parent.name
这将返回以下内容:
n.name parent.name
b a
c a
e d
因此,对于您的用例,您可以在此处添加时间代替版本或使用TimeTree
如果需要,您可能还想在组件状态之间创建关系来代替组件状态与组件之间的关系。
希望这会帮助你。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.