Mohan Timilsina
Mohan Timilsina

Reputation: 500

py2neo.error. InvalidSemanticsException

I am stuck into Invalid Semantic exception error following is my code:

import json
from py2neo import neo4j, Node, Relationship, Graph

graph = Graph()
graph.schema.create_uniqueness_constraint("Authors", "auth_name")
graph.schema.create_uniqueness_constraint("Mainstream_News", "id")
with open("example.json") as f:
    for line in f:
        while True:
            try:
                file = json.loads(line)
                break
            except ValueError:
                # Not yet a complete JSON value
                line += next(f)

                # Now creating the node and relationships

        news = graph.merge_one("Mainstream_News", {"id": unicode(file["_id"]["$oid"]), "entry_url": unicode(file["entry_url"]),"title":unicode(file["title"])})
        authors = graph.merge_one("Authors", {"auth_name": unicode(file["auth_name"]), "auth_url" : unicode(file["auth_url"]), "auth_eml" : unicode(file["auth_eml"])})
        graph.create_unique(Relationship(news, "hasAuthor", authors))

I am trying to connect the news node with authors node.My Json file looks like this:

  {
  "_id": {
    "$oid": "54933912bf4620870115a2e3"
  },
  "auth_eml": "",
  "auth_url": "",
  "cat": [],
  "auth_name": "Max Bond",
  "out_link": [],
  "entry_url": [
    "http://www.usda.gov/wps/portal/usda/!ut/p/c5/04_SB8K8xLLM9MSSzPy8xBz9CP0os_gAC9-wMJ8QY0MDpxBDA09nXw9DFxcXQ-cAA_1wkA5kFaGuQBXeASbmnu4uBgbe5hB5AxzA0UDfzyM_N1W_IDs7zdFRUREAZXAypA!!/dl3/d3/L2dJQSEvUUt3QS9ZQnZ3LzZfUDhNVlZMVDMxMEJUMTBJQ01IMURERDFDUDA!/?navtype=SU&navid=AGRICULTURE"
  ],
  "out_link_norm": [],
  "title": "United States Department of Agriculture - Agriculture",
  "entry_url_norm": [
    "usda.gov/wps/portal/usda/!ut/p/c5/04_SB8K8xLLM9MSSzPy8xBz9CP0os_gAC9-wMJ8QY0MDpxBDA09nXw9DFxcXQ-cAA_1wkA5kFaGuQBXeASbmnu4uBgbe5hB5AxzA0UDfzyM_N1W_IDs7zdFRUREAZXAypA!!/dl3/d3/L2dJQSEvUUt3QS9ZQnZ3LzZfUDhNVlZMVDMxMEJUMTBJQ01IMURERDFDUDA!/"
  ],
  "ts": 1290945374000,
  "source_url": "",
  "content": "\n<a\nhref=\"/wps/portal/usda/!ut/p/c4/04_SB8K8xLLM9MSSzPy8xBz9CP0os_gAC9-wMJ8QY0MDpxBDA09nXw9DFxcXQ-cAA_2CbEdFAEUOjoE!/?navid=AVIAN_INFLUENZA\">\n<b>Avian Influenza, Bird Flu</b></a> <br />\nThe official U.S. government web site for information on pandemic flu and avian influenza\n\n<strong>Pest Management</strong> <br />\nPest management policy, pesticide screening tool, evaluate pesticide risk, conservation\nbuffers, training modules.\n\n<strong>Weather and Climate</strong> <br />\nU.S. agricultural weather highlights, weekly weather and crop bulletin, major world crop areas\nand climatic profiles.\n"
}

The full exception error is like this:

File "/home/mohan/workspace/test.py", line 20, in <module>
    news = graph.merge_one("Mainstream_News", {"id": unicode(file["_id"]["$oid"]), "entry_url": unicode(file["entry_url"]),"title":unicode(file["title"])})
  File "/usr/local/lib/python2.7/dist-packages/py2neo/core.py", line 958, in merge_one
    for node in self.merge(label, property_key, property_value, limit=1):
  File "/usr/local/lib/python2.7/dist-packages/py2neo/core.py", line 946, in merge
    response = self.cypher.post(statement, parameters)
  File "/usr/local/lib/python2.7/dist-packages/py2neo/cypher/core.py", line 86, in post
    return self.resource.post(payload)
  File "/usr/local/lib/python2.7/dist-packages/py2neo/core.py", line 331, in post
    raise_from(self.error_class(message, **content), error)
  File "/usr/local/lib/python2.7/dist-packages/py2neo/util.py", line 235, in raise_from
    raise exception
py2neo.error.InvalidSemanticsException: Cannot merge node using null property value for {'title': u'United States Department of Agriculture - Agriculture', 'id': u'54933912bf4620870115a2e3', 'entry_url': u"[u'http://www.usda.gov/wps/portal/usda/!ut/p/c5/04_SB8K8xLLM9MSSzPy8xBz9CP0os_gAC9-wMJ8QY0MDpxBDA09nXw9DFxcXQ-cAA_1wkA5kFaGuQBXeASbmnu4uBgbe5hB5AxzA0UDfzyM_N1W_IDs7zdFRUREAZXAypA!!/dl3/d3/L2dJQSEvUUt3QS9ZQnZ3LzZfUDhNVlZMVDMxMEJUMTBJQ01IMURERDFDUDA!/?navtype=SU&navid=AGRICULTURE']"}

Any suggestions to fix this ?

Upvotes: 0

Views: 236

Answers (1)

FrobberOfBits
FrobberOfBits

Reputation: 18002

Yeah, I see what's going on here. If you look at the py2neo API and look for the merge_one function, it's defined this way:

merge_one(label, property_key=None, property_value=None)
Match or create a node by label and optional property and 
return a single matching node. This method is intended to be 
used with a unique constraint and does not fail if more than 
one matching node is found.

The way that you're calling it is with a string first (label) and then a dictionary:

news = graph.merge_one("Mainstream_News", {"id": unicode(file["_id"]["$oid"]), "entry_url": unicode(file["entry_url"]),"title":unicode(file["title"])})

Your error message says that py2neo is treating the entire dictionary like a property name, and you haven't provided a property value.

So you're calling this function incorrectly. What you should probably be doing is merge_one only on the basis of the id property, then later adding the extra properties you need to the node that comes back.

You need to convert those merge_one calls into something like this:

news = graph.merge_one("Mainstream News", "id", unicode(file["_id]["$oid]))

Note this doesn't give you the extra properties, those you'd add later.

Upvotes: 2

Related Questions