【问题标题】:How to use Neo4J for temporary graph calculations?如何使用 Neo4J 进行临时图形计算?
【发布时间】:2017-06-12 15:31:20
【问题描述】:

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

设置

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

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

要求

  • 我不想将我的更改写入原始图表,因为每次原始图表都应该是分析的基础。也是因为不同用户可能同时更改和分析图形。
  • 我仍然想使用 Cypher 的强大功能进行分析,因此仅将图表放在内存中是行不通的。

问题

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

问题

  • 有什么最佳做法吗?
  • 我可以直接在代码中使用 Cypher(非持久性,直接在内存中的数据上)吗?
  • 我是否应该在使用图表时复制它(不是真的, 对吧?)?
  • 是否有将用户特定数据链接到静态图表的概念?

我对所有想法、概念和技巧都很满意!总的来说,它更多的是关于图形数据库......到目前为止,Neo4J 是我的首选。

干杯 克里斯

【问题讨论】:

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


    【解决方案1】:

    如何通过使用不同的关系类型在图表中使用特征标志?

    例如,假设您的用户喜欢原始图表中的 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

    【讨论】:

    • 我觉得添加一个用户节点和新的关系必须是解决方案。我需要先感受一下……我可能会再问你一些问题。非常感谢。
    【解决方案2】:

    我的建议是:

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

    类似这样的:

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

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

    1. 处理此副本。

    您可以将这些说明转换为 .sh 文件以自动执行该过程。

    【讨论】:

    • 这听起来像是一个非常重量级的解决方案。想象成百上千的用户使用图表进行实验。如果基础数据发生变化怎么办?这不可能是最佳实践。无论如何,非常感谢你的想法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    • 1970-01-01
    相关资源
    最近更新 更多