我正在尝试建立一个交易网络,账户可以在单笔交易中交易多个项目。我想使用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数据库中最好的结构是什么?我正在努力解决如何最好地处理数组的性质,因为我希望能够询问数据库,列出我已交易的所有账户'防晒霜'为了豌豆'。
感谢。
答案 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
个节点数。