在具有不同属性的节点之间创建相同的关

时间:2017-04-26 07:27:14

标签: neo4j relationship graph-databases py2neo

我正在创建一个简单的社交图,用户可以在其中创建帖子,对其进行标记并对其进行评论。我正在使用py2neo进行建模。该模型具有userpost作为节点。 TAGGED上的用户POSTEDCOMMENTEDpost。就我而言,单个用户可以在一个tag上创建多个commentpost(就像任何社交网络一样)。根据我的模型,这需要多个TAGGEDCOMMENTED关系,但不同的属性。这个模型就这样构建了:

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关系,如下所示:

Expecting to see

但我发现事实并非如此:

enter image description here

我的问题是双重的。 (1)可以创建具有不同属性的相同类型的多个关系吗? (2)这是用例的最佳模型选择吗?

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