我正在创建一个简单的社交图,用户可以在其中创建帖子,对其进行标记并对其进行评论。我正在使用py2neo进行建模。该模型具有user
和post
作为节点。 TAGGED
上的用户POSTED
,COMMENTED
或post
。就我而言,单个用户可以在一个tag
上创建多个comment
或post
(就像任何社交网络一样)。根据我的模型,这需要多个TAGGED
或COMMENTED
关系,但不同的属性。这个模型就这样构建了:
from py2neo.ogm import (
GraphObject,
Property,
RelatedTo,
RelatedFrom
)
class User(GraphObject):
__primarykey__ = 'name'
name = Property()
posts = RelatedTo('Post', 'POSTED')
comments = RelatedTo('Post', 'COMMENTED')
tags = RelatedTo('Post', 'TAGGED')
def __init__(self, name):
self.name = name
class Post(GraphObject):
# assumes __id__ as primary key because
# left undefined
title = Property()
users = RelatedFrom('User', 'POSTED')
comments = RelatedFrom('User', 'COMMENTED')
tags = RelatedFrom('User', 'TAGGED')
def __init__(self, title):
self.title = title
我运行以下内容来构建图表:
user = User(name='john')
post = Post(title='Wow!')
user.posts.add(
post,
{'date': '2017-04-26'}
)
graph.push(user)
user.comments.add(
post,
{'caption': 'I know!', 'date': '2017-04-26'}
)
graph.push(user)
for tag in ['yellow', 'green']:
user.tags.add(
post,
{'tag': tag, 'date': '2017-04-26'}
)
graph.push(user)
我希望有两个TAGGED
关系,如下所示:
但我发现事实并非如此:
我的问题是双重的。 (1)可以创建具有不同属性的相同类型的多个关系吗? (2)这是用例的最佳模型选择吗?
答案 0 :(得分:1)
您可以使用neo4jrestclient。它使您可以拥有多个相同类型的关系,并且使用起来也非常容易。您可以使用以下代码:
from neo4jrestclient.client import GraphDatabase
gdb=GraphDatabase("http://localhost:7474/db/data/")
user=gdb.nodes.create(name='john')
post=gdb.nodes.create(title='wow')
user.labels.add('User')
post.labels.add('Post')
u=gdb.labels.get('User')
p=gdb.labels.get('Post')
现在有多种关系
for tag in ['yellow', 'green']:
u.get(name='john')[0].relationships.create('TAGGED',p.get(id=0)[0],tag=tag,date='2017-04-26')
这应该做到。 .get用于更新节点,类似于.push。 可以有更清洁的方法来执行此操作,但是您知道了。该文档也相当不错。 https://readthedocs.org/projects/neo4j-rest-client/downloads/pdf/latest/
答案 1 :(得分:0)
虽然neo4j(和neto4j的大多数编程接口,如Cypher)确实支持一对节点之间相同类型的多个关系(可能有不同的属性集),py2neo
似乎没有(见{ {3}})。
我建议您考虑使用其他方式来使用this issue,例如官方支持的neo4j from Python。