我正在创建一个简单的社交图,用户可以在其中创建一个帖子,标记它,并对它进行评论。我用py2neo做模型。该模型具有user
和post
作为节点。用户在文章
上标记
、发布
或评论
。在我的例子中,单个用户可以在单个post
上创建多个tag
或comment
(就像其他任何社交网络一样)。根据我的模型,这需要多个标记的
或注释的
关系,但具有不同的属性。模型是这样建立的:
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)这是用例的最佳模型选择吗?
虽然neo4j(以及neo4j的大多数编程接口,如Cypher)确实支持单对节点之间的多个相同类型的关系(可能具有不同的属性集),但py2neo
似乎不支持(请参见本问题)。
我建议您考虑使用一些其他方式从Python中使用neo4j,像官方支持的neo4j Python驱动程序。
您可以使用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/
我需要在所有具有相同属性值的节点之间创建关系。 例如,我可以使用以下查询: 但是如果我有大约200K的节点,这个脚本运行的时间相当长。 有没有其他更快的方法来建立这样的关系? 谢谢
我有以下图表: 我正在寻找一种方法来计算从a发送到b和从b发送到c/d的金额之间的差异,这取决于referenceId,但不使用特定的referenceId。 所以我在寻找像下面这样的半代码: 有人知道我该怎么做吗?
从Neo4j 1.9开始。2,并使用Cypher查询语言,我希望在具有特定公共属性值的节点之间创建关系。我有一组具有属性H的节点G,在G节点之间当前不存在任何关系。 在Cypher语句中,是否可以按H属性值对G节点进行分组,并在成为同一组的每个节点之间创建关系HR?知道每个小组的人数在2人之间 我一直在努力管理这样的查询,但没有找到正确的语法。下面是一个小样本数据集: 最后,我希望有这样的关系:
人员节点: 名字 姓氏 地址 电子邮件 电话号码 公司节点: 姓名 地址 电子邮件 电话号码 关系: 个人-[配偶]- 个人和实体: 当我为简创建一个人时,我也添加了与约翰的兄弟姐妹关系。 运行检索节点Jane和对应的同级节点John。 但是,手足关系应该是双向的。运行仅检索节点John。 这就是问题所在。我可以在约翰和简之间添加另一种兄弟姐妹关系。但是,这实际上在两者之间创建了一个无限循环。以及
我现在的解决办法是先保存所有的ArchitectureUnitState节点,从数据库中再次检索它们,将一个节点映射到另一个节点,然后再次保存它。这样,可以创建关系,但我需要保存两次。
我很难使用下面的用例。 以下是XML: 我想要实现的是基于节点