在Neo4J中存储时间相关的东西

时间:2016-08-22 13:56:53

标签: neo4j cypher

我想在我的图表中存储与时间相关的信息,用于节点和关系。 理想情况下,在编程语言中,我会使用一个有序映射,将日期和属性作为关键字存储在每个值(例如价格)中,例如,一个人将有一个名为“付费”的地图和条目如“2016/02/12”,2;“2016/03/21”,5; ..... 关系也是如此:餐馆和PERSON之间的关系会有相同的地图,称为“付费”,以了解何时和多少。

在Neo4J,我真的不知道。我可以存储2个数组作为属性,一个有日期,一个有价格,但问题是如何插入尊重顺序(最后插入并不意味着更新),我如何查询:我想要所有关系在X和Y之间有一个日期。这对Cypher来说似乎并不重要。

我的另一个想法是每个日期创建一个关系。这使得图形在相同节点之间具有巨大的关系负载,但是查询更容易。这并不能解决节点的问题,只能解决关系问题。

我在这里看到了另一个解决方案:为每个日期添加一个属性,例如Person.2016 / 02/12 = 2,Person.2016 / 03/21 = 5等... Neo4J的问题是不接受这种类型的属性命名,我不知道如何按日期查询。

任何帮助都将不胜感激。

谢谢!

- edit-- 实际上,我需要大量的支付节点(基本上每天,每天,几年,数十万个节点),添加支付节点将使我的图表增长很多。实际上,我设法在Java中执行插入等...所以基本上我将总是在我的节点/关系中排序两个数组...我不知道的是我是否可以查询图表,例如,数组“dates”的条目的索引将是> = date1和数组条目的索引“dates”将是< = date2

1 个答案:

答案 0 :(得分:0)

当您需要属性的多个值时,您始终可以引入节点:您可以链接到Payment节点,而不是CREATE (p:Person {uid: 1}) # Add multiple payments, that can be queried by date CREATE (p)-[:IS_PAID {date: "2016-02-12"}]->(:Payment {amount: 2}) CREATE (p)-[:IS_PAID {date: "2016-03-21"}]->(:Payment {amount: 5}) 属性:

MATCH (p:Person {uid: 1})-[rel:IS_PAID]->(p:Payment)
WHERE "2016-02-01" <= rel.date < "2016-03-01"
RETURN sum(p.amount) AS total

您还可以使用数字值作为日期(例如时间戳)。然后,您可以轻松查询:

CREATE (p:Person {uid: 1}), (r:Restaurant {uid: 1})
# Create an archetype of a meal (a person in a restaurant)
CREATE (p)-[:HAS_MEAL]->(m:Meal)<-[:SERVES_MEAL]-(r)
# Add multiple payments for actual meals
CREATE (m)-[:IS_PAID {date: "2016-02-12"}]->(:Payment {amount: 2})
CREATE (m)-[:IS_PAID {date: "2016-03-21"}]->(:Payment {amount: 5})

你也可以在关系的上下文中做类似的事情,以避免创建只包含不同支付数据的“重复”关系,代表超图:

MATCH (p:Person {uid: 1}), (r:Restaurant {uid: 1})
MATCH (p)-[:HAS_MEAL]->(m:Meal)<-[:SERVES_MEAL]-(r)
MATCH (m)-[rel:IS_PAID]->(p)
WHERE "2016-02-01" <= r.date < "2016-03-01"
RETURN sum(p.amount) AS total

您获得2个关系和一个节点而不是单个关系,但是它可以重复用于所有付款,并且您在Person和Restaurant之间保留一条路径,您可能需要在查询中不需要使用付款。

它像以前的节点一样容易查询:

  • 2月份某人在特定餐厅支付的总额:

    MATCH (p:Person {uid: 1})
    MATCH (p)-[:HAS_MEAL]->(m:Meal)<-[:SERVES_MEAL]-(r:Restaurant)
    MATCH (m)-[rel:IS_PAID]->(p:Payment)
    WHERE "2016-02-01" <= r.date < "2016-03-01"
    RETURN r, sum(p.amount) AS total
    
  • 每个餐厅2月份每人支付的总额:

    MATCH (p:Person {uid: 1})
    MATCH (p)-[:HAS_MEAL]->(m:Meal)<-[:SERVES_MEAL]-(r:Restaurant)
    MATCH (m)-[rel:IS_PAID]->(:Payment)
    WHERE "2016-02-01" <= r.date < "2016-03-01"
    RETURN DISTINCT r
    
  • 二月份一个人去过的餐馆:

    MATCH (p1:Person {uid: 1}), (p2:Person {uid: 2})
    MATCH (p1)-[:HAS_MEAL]->(:Meal)<-[:SERVES_MEAL]-(r:Restaurant),
          (p2)-[:HAS_MEAL]->(:Meal)<-[:SERVES_MEAL]-(r)
    RETURN r
    
  • 餐厅有2人参观过:

    elseif