Neo4j文件结构为数组类型

时间:2016-06-01 19:16:11

标签: neo4j

我正在尝试建立一个交易网络,账户可以在单笔交易中交易多个项目。我想使用neo4j快速识别和可视化帐户行为以及特定项目的移动

我们的mongodb文档看起来有点像这样

{
    _id: 1233 // doc id
    date: ISODate("2015-05-01T01:00:00"),
    trade_id: 21312 
    account: 'joe'
    to_account: 'tim' 
    items:
    [
       { name: 'oil',count: '5' },
       { name: 'sunscreen', count: 1}
    ] 
},
{
    _id: 1234 // doc id
    date: ISODate("2015-05-01T01:00:00"),
    trade_id: 21312 
    account: 'tim'
    to_account: 'joe' 
    items:
    [
       { name: 'peas',count: '100' },
    ] 
}

neo4j数据库中最好的结构是什么?我正在努力解决如何最好地处理数组的性质,因为我希望能够询问数据库,列出我已交易的所有账户'防晒霜'为了豌豆'。

感谢。

2 个答案:

答案 0 :(得分:1)

数组是一组记录 - 在Neo4j中对应于具有相同标签的节点。

候选设计将是一组“Trade”和“Item”节点,如下所示:

CREATE (trade:Trade {id: 1233, 
                     date: "2015-05-01T01:00:00", 
                     trade_id: 21312,
                     account: 'joe',
                     to_account: 'tim'})

CREATE (itm1:Item {name: 'oil',       count: 5})
CREATE (itm2:Item {name: 'sunscreen', count: 1})

CREATE (trade)-[:ITEM]->(itm1)
CREATE (trade)-[:ITEM]->(itm2)

“Trade”节点将是封闭值,“:Item”节点将对应于“item”数组元素。

要获取值 - 使用:ITEM关系对“:Trade”和“:Item”节点之间的关系执行MATCH(),如下所示:

MATCH (trade:Trade)-[ritm:ITEM]->(itm:Item)
RETURN trade, ritm, itm

<强>更新 此版本将帐户信息拆分为他们自己的标记节点集,并将项目数量存储在他们自己的标记节点集中。这遵循更加“RDB”的方式来看待事物。这也假设有超出数量的项目行特定信息需要跟踪。

// Ensure the accounts exist

MERGE (fromacct:Account {account: 'joe'})
MERGE (toacct:Account   {account: 'tim'})

// Ensure the items exist

MERGE (item1:Item {name: 'oil})
MERGE (item2:Item {name: 'sunscreen'})

// Create the trade transaction

CREATE (trade:Trade {id: 1233,
                     date: "2015-05-01T01:00:00", 
                     trade_id: 21312
                     })

// Create the item line records

CREATE (itemline1:ItemLine {count: 5})
CREATE (itemline2:ItemLine {count: 2})

// link the trade to the item lines

CREATE (trade)-[:ITEMLINE]->(itemline1)
CREATE (trade)-[:ITEMLINE]->(itemline2)

// link the item lines to the items

CREATE (itemline1)-[:ITEM]->(item1)
CREATE (itemline2)-[:ITEM]->(item2)

// link the trade to the items

CREATE (trade)-[:ITEM]->(item1)
CREATE (trade)-[:ITEM]->(item2)

答案 1 :(得分:1)

我会稍微修改@ TimKuehn的数据模型,使其更具“图形性”。由于您可能会购买大量相同的项目,因此每个产品都应该有一个可重用的Item节点实例。 ITEM关系应包含特定于购买的数据(如项目计数)。

例如:

CREATE (trade:Trade {id: 1233, 
                     date: "2015-05-01T01:00:00", 
                     trade_id: 21312,
                     account: 'joe',
                     to_account: 'tim'})

MERGE (oil:Item {name: 'oil'})
MERGE (sunscreen:Item {name: 'sunscreen'})

CREATE (trade)-[:ITEM {count: 5}]->(oil)
CREATE (trade)-[:ITEM {count: 1}]->(sunscreen)

MERGE子句避免创建重复的Item个节点。您可能还想创建适当的uniqueness constraint以确保Item唯一性(并加快某些查询)。

此模型大大减少了所需的Item个节点数。