在Neo4j中将对象存储为属性

时间:2015-05-12 20:41:39

标签: neo4j neo4jclient

我需要在Tile节点中存储一组User对象。每个User对象包含三个原始属性; Id(单个字符串字符串),fName和lName。此对象列表是Tile节点的一个属性,具有多个其他基本属性。整个Tile节点需要序列化为Json,包括嵌套的User对象。

我知道Neo不能将复杂对象存储为属性。我创建了User作为一个单独的节点,id,fName和lName作为属性,我可以通过Cypher返回这些节点。我还可以获取父Tile节点的Json输出结果。 (在这种情况下,Users只是一串以逗号分隔的alphas)。但是如何将用户节点输出嵌套在父节点中呢?

我通过Cypher查询将用户对象与Tile Node中的用户ID字符串相关联,创建了User对象列表(userList)。我只需要从两个单独的json输出到一个嵌套输出。

我希望这足够详细。我使用的是Neo4j 2.1.6和Neo4jClient。我也使用.Net 4.0。

3 个答案:

答案 0 :(得分:6)

你可以用cypher做这样的事情并让密码返回一个复合对象。

MATCH (t:Tile)-[:CONTAINS_USER]-(u:User)
WHERE t.name =~ 'Tile.*'
WITH {name: t.name, users: collect(u) } AS tile
RETURN collect(tile) AS tiles 

答案 1 :(得分:5)

您不应将另一个对象存储为嵌套属性。正如你所说的那样,neo4j并不支持它,但即使它确实如此,你也不应该这样做,因为你应该将这两者联系起来。这是像neo4j这样的图形数据库的关键优势,所以你应该发挥这种优势并使用这种关系。

服务器具有默认的JSON格式,倾向于将节点作为自己的JSON对象输出。这意味着实际上,由于您要将其建模为具有关系的两个单独节点,因此您无法在默认情况下获取服务器以将一个对象的JSON嵌套在另一个对象之下。它不会以这种方式嵌套JSON,因为这不是数据的存储方式。

在这种情况下,我使用REST服务单独为每个对象获取JSON,然后在代码中自行嵌套 - 您的代码是您知道哪个代码的唯一位置属性应该嵌套在下面,以及应该如何进行。

答案 2 :(得分:2)

除了这些答案之外,请注意,如果您不需要在任何查询中涉及子字段属性(例如,搜索User.name为“X”的Tiles),您只需序列化在插入之前将对象字段转换为字符串(例如,使用JSON.stringify),并在从数据库读取时取消序列化。

当您想要将结构化数据“附加”到节点时,这尤其有用,但您对数据库中的关系(例如用户首选项)并不太关心这些数据。