如何使用Neo4J进行临时图形计算?

时间:2017-06-12 15:31:20

标签: neo4j graph-theory graph-algorithm graph-databases

我对Neo4J完全陌生,我正在努力解决设计/架构问题。

设置

我有一个具有不同节点的给定图表。这可能是包含客户,产品,项目,销售等的公司图表(如电影示例https://neo4j.com/developer/get-started/中所示)。此图表可能会不时更改。

在我的用例中,我想采用这个图,调整它并测试一些场景。 E. g。我会添加一个新产品,定义一个有责任的新销售人员或提高产品的价格。对于扩展图表,我将提出问题"换句话说,我会使用图算法来提取信息。我所做的更改不应影响原始图表。

要求

  • 我不想将我的更改写入原始图表,因为每次原始图表都应该是分析的基础。另外,因为更改和分析图表可能会同时发生在不同的用户之间。
  • 我仍然想利用Cypher的力量进行分析,因此仅在内存中使用图表是不行的。

问题

一方面我不想改变原始图形,另一方面我想为特定用户临时添加和更改信息。使用关系数据库我只需要将一个ID指向"静态"部分数据或我会在Code而不是SQL中进行计算。

问题

  • 有什么最佳做法吗?
  • 我可以直接在代码中使用Cypher(非持久性,直接使用memoty中的数据)吗?
  • 每当我使用它时,我是否应该制作图表的副本(不是真的, 右?)?
  • 是否有将用户特定数据与静态图表相关联的概念?

我对所有想法,概念和技巧感到高兴!它更多地是关于图形数据库的......一般来说,Neo4J是我的第一选择。

干杯 克里斯

2 个答案:

答案 0 :(得分:3)

如何使用不同的关系类型在图表中使用要素标记?

例如,假设您的用户喜欢原始图表中的10部电影。

(user)-[:LIKES]->(movies)

然后,对于您的实验,您可以

(user)-[:LIKES_EXPERIMENT]->(othermovies)

这使您可以通过强制执行关系类型,以原始方式遍历图形而不会失去性能。另一方面,它还为您提供了仅使用实验或将原始数据与实验相结合的可能性,方法是在遍历中指定两种关系类型。

对于属性也是如此,例如,您可以使用experiment_为属性添加前缀。最后你还可以玩不同的标签。在使用不同的图形数据存储之前,有很多可能性。

另一种可能性是使用如此处所述的某种版本控制:

http://iansrobinson.com/2014/05/13/time-based-versioned-graphs/ 但没有时间因素。

它还有一个很好的插件https://github.com/h-omer/neo4j-versioner-core

答案 1 :(得分:0)

我的建议是:

  1. 将原始数据库的data folder复制到新位置:sudo cp /path/to/original/data/folder ~/neo4j
  2. 运行Docker容器,将数据文件夹的副本映射为容器数据文件夹。
  3. 这样的事情:

    docker run \
    --publish=7474:7474 --publish=7687:7687 \
    --volume=$HOME/neo4j/data:/data \
    neo4j
    

    如果正在使用:7474:7686,您可以指定其他端口。

    1. 处理此副本。
    2. 您可以在.sh文件中转换这些说明,以自动执行此过程。